[年末礼包]称重仪表数据解析控件代码(涵盖多数地磅仪表协议)

leeky 2017-01-18 10:28:55
声明:这个代码不是多难,但好在资料还算全,可给部分尚在从事称重行业的朋友们一个参考,即使代码无用,或许某些协议你用得上。
代码共1352行,基于继承于TCnRS232,其实从SPCOMM也是一样的(我更早的版本就是基于SPCOMM),只要改几行代码就可以了,但从过去的经验看,用TCnRS232更好,SPCOMM会在某些场景下出问题。
代码需要发好多次,如果CSDN还如以前一样限制连续发帖(/回帖)次数,到时还得兄弟们顶一下,我才能继续发下去。

unit UnitWeighDevCn;

interface

uses
Classes,CnClasses, CnRS232,ExtCtrls,Types,SysUtils,FmtBcd , Dialogs,StrUtils,UnitCRC16B;
type
TDevStatus = record
Weight : Integer; //重量
Steady : Boolean; //重量是否稳定
Connected : Boolean; //是否连接(有串口数据)
end;

TGetWeight = procedure(Sender :TObject ; Weight : Integer;RealDigit :integer ) of object;
TGetRawData = procedure(Sender :TObject ;RawData: Pointer;Length : integer) of object;

TWeighDevCn = class(TCnRS232)
private
FSteady : Boolean; //重量是否稳定
FConnected : Boolean;

RawDataGot : Integer;
CommBuffer : array[1..300] of Byte;
SendBuf : array[1..50] of Byte;
TimerCommCheck : TTimer; //通信检测的定时器,看看串口数据是否正常。
TimerSteadyCheck : TTimer; //重量稳定判断定时器。
TimerD2008Send :TTimer; //2014-10-23 李杨 D2008指令模式读命令

FCheckInterval : Byte; //检测仪表通讯时间间隔,单位:秒
FWeighTime : TDateTime; //称重时间
FWeight : Integer; //重量
FDeviation : integer; //重量稳定允许误差。
FMaxWeight : integer;
FMinWeight :integer;
FDevType : string; //仪表类型。

FGetWeight : TGetWeight;
FGetRawData : TGetRawData;
FNotConnect : TNotifyEvent;

FWeightAndDec:string; //2014-10-23 含有小数点的重量如D2008指令类型重量
FDevAddr : Byte;

procedure D2PlusSetZero(Addr :Char);
procedure D2008FSetZero();
procedure D2PlusReadWt(Addr :Char);
procedure D2008FReadWt();

procedure OnCommCheckTimer(Sender: TObject);
procedure OnSteadyCheckTimer(Sender : TObject);
procedure SendD2008GetValueOrder(Sender : TObject); //2014-10-23 李杨 用于发送获取2008数据命令

procedure SetCurrWt ( CurrWt : Integer);

procedure SetGetWeight(GetWeightFunc : TGetWeight);
procedure SetGetRawData(GetRawDataFunc : TGetRawData);
procedure SetNotConnect(NotCon : TNotifyEvent);
procedure SetCheckInterval(intval : Byte);

procedure ProcessGotWeight(currWeight,Precision :integer);
function Handle3190(CommBuffer:Pointer;Length:integer):Boolean;
function HandleDI_880(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleDS822_D(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleXK3190D2(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleXK3190D2InstructMode(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleD2008F(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleD2002(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleD2002E(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleD2002E_2(CommBuffer:Pointer;Length:integer):Boolean ; //新疆和静碰到怪的协议
function HandleWS822_A(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleT800(CommBuffer:Pointer;Length:integer):Boolean ;
function HandleHT9800_B(CommBuffer:Pointer;Length:integer):Boolean;
function Handle8142ProPlus(CommBuffer:Pointer;Length:integer):Boolean ;

//2008年5月4日 新增类型。
function HandleXK3102(CommBuffer:Pointer;Length:integer):Boolean;
function HandleXK315A2(CommBuffer:Pointer;Length:integer):Boolean;

//2014-10-23 李杨 D2008指令模式
function HandleD2008CommandType(CommBuffer:Pointer;Length:integer):Boolean;

procedure ReceiveCommData(Sender :TObject; Buffer : Pointer; BufferLength :Word);

function SendWeight3190(Weight,Precision : Integer):Boolean;
function SendWeightD2Plus(Weight,Precision: integer): Boolean;
function SendWeight3102(Weight,Precision : Integer):Boolean;
function SendWeightDI_880(Weight,Precision : Integer):Boolean ;
function SendWeightDS822_D(Weight,Precision : Integer):Boolean ;
function SendWeightXK3190D2(Weight,Precision : Integer):Boolean ;
function SendWeightD2002(Weight,Precision : Integer):Boolean ;
function SendWeightWS822_A(Weight,Precision : Integer):Boolean ;
function SendWeightT800(Weight,Precision : Integer):Boolean ;
function SendWeightHT9800_B(Weight,Precision : Integer):Boolean;
function SendWeight8142ProPlus(Weight,Precision : Integer):Boolean ;

protected

public
constructor Create(AnOwner: TComponent); override;
destructor Destroy; override;

procedure PickWeight(var Weight : Integer; var WeighTime :TDateTime);
procedure SendWeight( Weight,Precision : Integer); //组件作为仪器模拟用的功能。
function GetDevStatus : TDevStatus;



procedure ReadWeight(Addr :Char);
procedure SetZero(Addr : Char);



published
//作为接收解算用:
property DevType : string read FDevType write FDevType; //仪表类型
property DevAddr : Byte read FDevAddr write FDevAddr;
property Deviation : integer read FDeviation write FDeviation;
property CheckInterval : Byte read FCheckInterval write SetCheckInterval;
property OnGetWeight : TGetWeight read FGetWeight write SetGetWeight; //得到新的重量数据。
property OnGetRawData : TGetRawData read FGetRawData write SetGetRawData ; //得到原始数据。
property OnNotConnect : TNotifyEvent read FNotConnect write SetNotConnect; //仪表较长时间没有发送数据。
property OnGetWeightAndDec: string read FWeightAndDec; //2014-10-23 含有小数点的重量如D2008指令类型重量 write Set;
end;

procedure Register;

...全文
2451 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
wensoft80 2021-02-20
  • 打赏
  • 举报
回复
引用 33 楼 leeky 的回复:
[quote=引用 31 楼 wensoft80 的回复:]你好,这个控件怎么用呀,能给点思路吗?这样的用法没有用过,能留个联系统方式吗?
这个控件很简单,到cnpack的官网下载cnvcl装上就可以了,其实就是处理控件的接收数据的事件: Self.OnReceiveData := ReceiveCommData;[/quote] 装上cnpack官网下载的cnvcl,再安装你的这个控件,提示: It contains unit 'CnRS232,'which is also contained in package 'CnPack_D7
leeky 2020-11-09
  • 打赏
  • 举报
回复
引用 32 楼 IORILI 的回复:
一直用SPCOMM,感觉稳定,挺好的。
尝试去cnpack网站下载cnvcl,会spcomm的话,替换过来没一点难度。(spcomm用过几年,直到后来找到cnpack的串口控件) Self.OnReceiveData := ReceiveCommData;
leeky 2020-11-09
  • 打赏
  • 举报
回复
引用 31 楼 wensoft80 的回复:
你好,这个控件怎么用呀,能给点思路吗?这样的用法没有用过,能留个联系统方式吗?
这个控件很简单,到cnpack的官网下载cnvcl装上就可以了,其实就是处理控件的接收数据的事件: Self.OnReceiveData := ReceiveCommData;
IORILI 2020-04-14
  • 打赏
  • 举报
回复
一直用SPCOMM,感觉稳定,挺好的。
wensoft80 2020-04-11
  • 打赏
  • 举报
回复
你好,这个控件怎么用呀,能给点思路吗?这样的用法没有用过,能留个联系统方式吗?
取昵称麻烦 2019-12-12
  • 打赏
  • 举报
回复
学习,谢谢楼主分享,收藏了
wjh0494 2019-10-06
  • 打赏
  • 举报
回复
学习一下,能看到这样的称重代码不容易啊。
老大i 2019-10-05
  • 打赏
  • 举报
回复
这个可以有11
For_Proper_Code 2019-10-04
  • 打赏
  • 举报
回复
学习一下,想自己开发个单位可用的erp模块,称重模块令人头疼
leeky 2018-11-16
  • 打赏
  • 举报
回复
引用 23 楼 chaofan_221 的回复:
UnitCRC16B,这个是自定义的吗?

也是网络上找得到的一个CRC算法,因为手头接触到两个算法,某仪表跟其中一个对应的。
lyhoo163 2018-11-16
  • 打赏
  • 举报
回复
天涯倦客 2018-11-16
  • 打赏
  • 举报
回复
不错,楼组辛苦了
chaofan_221 2018-09-25
  • 打赏
  • 举报
回复
UnitCRC16B,这个是自定义的吗?
chaofan_221 2018-09-25
  • 打赏
  • 举报
回复
支持共享源码,顶。
donil 2017-08-26
  • 打赏
  • 举报
回复
支持共享源码,顶。
dacsd 2017-08-17
  • 打赏
  • 举报
回复
好东东,值得收藏
chailang 2017-08-05
  • 打赏
  • 举报
回复
在这儿终于看到了
lyhoo163 2017-04-22
  • 打赏
  • 举报
回复
hongss 2017-04-22
  • 打赏
  • 举报
回复
2017感动CSDN
skyclin 2017-04-21
  • 打赏
  • 举报
回复
真心赞一个!!!好人啦!!!
加载更多回复(15)

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧