Delphi的MSCOMM实现上位机与PLC间的串行通信
CommPort 属性:用于设置或返回通讯端口号。计算机的串行通讯端口一般有 COM1和 COM2 两个,必须在打开端口以前设置该属性。如果设置的端口不存在,运行时会产生设备无效错误。
CommEvent 属性:返回通信事件或错误。Setting 属性:设置并返回初始化参数,即波特率、奇偶校验、传输数据位和停止位。InputMode 属性: 设置或返回接收到的数据的类型。缺省为 ComInputModeText 表示以文本(ASCI码)形式接收数据,而 ComnputModeBinary 表示以二进制形式接收数据Input 属性:返回并删除接收缓冲区中的数据,在设计时 Output 属性:向输出级冲区中写入数据,在设计时无效,运行时为只读。
Output 属性:向输出缓冲区中写入数据,在设计时无效,运行时为只读。
PortOpen 属性:设置并返回通信端口开或关的状态,运行时有效。
Commlnit 方法:初始化并打开指定的串口。
RecvData 方法:接收数据。
SendData 方法:发送数据。
ComOpenOrClose 方法: 打开或关闭串口。
OnComm 事件:当 CommEvent 属性的值发生变化时,就产生此事件,标志发生了一个通信事件或错误。
通信模块作为上位机和 PLC 交换数据的平台,具有十分重要的作用。通信模块的设计主要包括几个方面:
1、串口初始化。串口初始化包括设置通信协议、输入输出缓冲区大小等内容。
2、数据的接收和发送以及校验。上位机首先发出命令给 PLC,PLC 从串口输出缓冲区内接收数据,然后 PLC 自动发送一个响应,上位机检测到输入缓冲区的数据开始接收数据。命令帧的格式为站号、读/写操作类型、发送数据、校验码、结束字符。响应帧的格式为站号、接收数据、校验码、结束字符。为了保证通信数据的正确性,上位机对接收到的数据需要进行校验,校验是通过一个 BCC 校验函数来进行。BCC 校验码就是将要传送的字符串的 ASCII码以字节为单位作异或运算,并将异或运算结果作为指令的一部分传送出去。
3、数据转换。由于 PLC 在发送数据时,有些模拟量数据,如管网压力和电机转速,采用的是二进制的形式,在计算机接受到数据之后必须进行转换,方能正确显示。
4、错误处理和报警。对于传输过程中可能出现的各种错误,需要采取相应的处理措施,不可恢复的严重错误必须报警。
通信模块中的部分事件源代码如下:
//串口初始化
procedure TfrmCommTest.commInit:
bcgin
if MSComm1.PortOpen then MSComml.PortOpen:=false;MSComm1.Settings:-cboSetting.Text;if chkTextOrBin.Checked then
MSComml.InputMode:=ComInputModeText//文本形式else MSComm1.InputMode:=ComInputModeBinary://二进制形式MSComm1InputLen:=0://读接收缓冲区所有数据MSComm1.InBufferSize:=CommOptioninbuffer;//设置缓冲区大小MSComm1.OutBufferSize:=-CommOption.outbuffer;MSComm1.RThreshold:=1://每接收到一个字符都产生 OnComm 事件
if cboCommPort.Text='COM1' thenMSComm1.CommPort:=1
else
MSComm1.CommPort:=2;
MSComm1.Handshaking:-CommOption.handshakc://设置握手协议end
procedure TfrmCommTest.chkSendHexClick(Sender: TObject):var bChk:boolean;
str:string:
begin
if chkSendHex.Checked then //十六进制形式
begin
bChk:=true;
end
else //字符串形式
begin
bChk=false;
end:
str:=ConvertHexChar(memSend.Text,bChk):
memSend.Clear;
memSend.Text:=str;
end:
procedure TfrmCommTest.chkRecvHexClick(Sender: TObject):var bChk:boolean;
str:string;
begin
ifchkRecvHex.Checked then //十六进制形式
begin
bChk:-truc;
end
else //字符串形式
begin
bChk:=false;
end:
str:=copy(memRecv.Text,1,length(memRecv.Text))://需转换的字符str:=ConvertHexChar(str,bChk):
大林上位机机器视觉,_苏州电工培训_苏州PLC培训_苏州机器视觉培训_苏州上位机培训_苏州工业机器人培训,最适合电工及plc编程人员学习的上位机机器视觉课程 大林老师:15861139266(微信同号)
memRecv.Clear;
memRecv.Text:=str;
end;
//发送数据
procedure TfrmCommTest,SendData
var str:string;
begin
str-"
ifnot MSComml.PortOpen then//串口未打开
begin
MessageDlg(请先打开串口!mtInformation,[mbOk].0):
exit;
end
else //串口已打开
begin
if memSend.Text=" then
MessageDlg(请输入需要发送的数据!mtInformation,[mbOk]0);str=memSend.Text:
sumSend:=sumSend+length(str):
MSComm1.Output:=str;
edit2.Text:=inttostr(sumSend):
end:
end;
//接收数据
procedure TfrmCommTest.RecvData;
var s:string;
VTmp: Variant;
ovTmp:oleVariant;
i,iRecv:integer;
bTmp:Byte;
begin
ifMSComml.InputMode=ComInputModeText then//文本形式
begin
iRecv:=MSComm1.InBufferCount:
s-MSComm1Input;
if chkAutoClcar.Checked then
memRecv.Text:=s
else memRecv.Text:=memRecv.Text+s:
sumRecv:=sumRecv+iRecv;edit3.Text:=inttostr(sumRecv):end
else //二进制形式
begin
iRecv:=MSComm1.InBufferCount;ovTmp:=MSComm1.Input;
vTmp:=VarArrayCreate(([0,127],varByte);
vTmp:=ovTmp;
版权所有:大林机器视觉培训苏州办事处所有 备案号:苏ICP备14016686号-6
本站关键词:苏州上位机培训 苏州机器视觉软件开发培训 苏州上位机运动控制培训 苏州深度学习培训 网站标签