常州plc培训

常州PLC编程培训

常州和讯自动化培训中心欢迎您!
当前位置:网站首页 > 技术资料 技术资料
Delphi的MSCOMM实现上位机与PLC间的串行通信-机器视觉学习-上位机学习
日期:2023/4/26 15:58:15人气:  标签:常州机器视觉学习-常州上位机学习

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;






本文网址:

相关信息:
版权所有 CopyRight 2006-2013 常州和讯自动化培训中心 电话:0519-85602926 地址:常州市新北区府琛商务广场2号楼1409室
《中华人民共和国电信与信息服务业务经营许可证》 编号:苏ICP证1312012312号 网站统计 技术支持:常州山水网络
本站关键词:常州plc培训 常州PLC编程培训网站地图 网站标签
在线与我们取得联系