上位机的通信模块设计
该恒压供水监控系统采用一台工控机对泵房的水泵机组进行监控,监控程序程序的功能包括水位、水压、电机速度信号的采集:监测显示水泵机组的工作状态和运行情况:检测故障信号,进行报警及语言提示:相关数据的存储、动态实时报表、历史数据的随时查询、打印:根据现场工作情况发出控制指令给 PLC 实行水泵机组的切换:根据生产实际情况修改工作参数等等。系统软件采用 Delphi 高级语言编程,能够及时准确地对供水自动化生产实行监控。串行通信作为上位机和下位机联系的桥梁,因此上位机通信模块设计在整
个监控程序占有非常重要的地位。用 Delphi 实现串口通信,最常用的办法是使用控件(如 MSCOMM 等),利用MSCOMM 控件开发串口通信程序,只需设置相关的属性,使用相关的方法与相应的事件,实现串口通信较为简单方便。本系统中上位机的信息管理及监控软件运行在Windows2000/NT 操作系统下,并利用 MSCOMM 控件开发设计了上位机与 PLC 的串行通信程序,对供水系统的运行状态进行监控。MSComm32 控件的主要属性、方法及事件如下
CommPort 属性:用于设置或返回通讯端口号。计算机的串行通讯端口一般有 COM1和 COM2 两个,必须在打开端口以前设置该属性。如果设置的端口不存在,运行时会产生设备无效错误。
CommEvent 属性:返回通信事件或错误。Setting 属性:设置并返回初始化参数,即波特率、奇偶校验、传输数据位和停止位。InputMode 属性:设置或返回接收到的数据的类型。缺省为 ComInputModeText 表示以文本(ASCII码)形式接收数据,而 ComInputModeBinary 表示以二进制形式接收数据Input 属性: 返回并删除接收缓冲区中的数据,在设计时 Output 属性: 向输出级冲区中写入数据,在设计时无效,运行时为只读。
Output 属性:向输出缓冲区中写入数据,在设计时无效,运行时为只读。PortOpen 属性:设置并返回通信端口开或关的状态,运行时有效。CommInit 方法:初始化并打开指定的串口
RecvData 方法:接收数据。
SendData 方法:发送数据。
ComOpenOrClose 方法:打开或关闭串口。
OnComm 事件:当CommEvent 属性的值发生变化时,就产生此事件,标志发生了一个通信事件或错误。
通信模块作为上位机和 PLC 交换数据的平台,具有十分重要的作用。通信模块的设计主要包括几个方面:
1、串口初始化。串口初始化包括设置通信协议、输入输出缓冲区大小等内容。
2、数据的接收和发送以及校验。上位机首先发出命令给 PLC,PLC 从串口输出缓冲区内接收数据,然后PLC 自动发送一个响应,上位机检测到输入缓冲区的数据开始接收数据。命令帧的格式为站号、读/写操作类型、发送数据、校验码、结束字符。响应帧的格式为站号、接收数据、校验码、结束字符。为了保证通信数据的正确性,上位机对接收到的数据需要进行校验,校验是通过一个 BCC 校验函数来进行。BCC 校验码就是将要传送的字符串的 ASCII 码以字节为单位作异或运算,并将异或运算结果作为指令的一部分传送出去。
3、数据转换。由于 PLC 在发送数据时,有些模拟量数据,如管网压力和电机转速采用的是二进制的形式,在计算机接受到数据之后必须进行转换,方能正确显示。4、错误处理和报警。对于传输过程中可能出现的各种错误,需要采取相应的处理措施,不可恢复的严重错误必须报警。
大林上位机机器视觉_苏州电工培训_苏州PLC培训_苏州上位机培训_苏州机器视觉培训_苏州工业机器人培训_最适合电工及plc编程人员学习的上位机机器视觉课程 大林老师:15861139266(微信同号)
通信模块中的部分事件源代码如下:
//串口初始化
procedure TfrmCommTest.commInit:
bcgin
if MSComm1.PortOpen then MSComm1.PortOpen:=false.MSComm1.Settings:=cboSetting.Text;if chkTextOrBin.Checked then
MSComm1.InputMode:=ComInputModeText//文本形式else MSComm1.InputMode:=ComInputModeBinary://二进制形式MSComm1InputLen:=0://读接收缓冲区所有数据MSComm1InBufferSize:=CommOption.inbufcr;//设置缓冲区大小MSComm1.0utBufferSize:=CommOption.outbuffer;MSComm1.RThreshold:=1://每接收到一个字符都产生 OnComm 事件
if cboCommPort.Text='COM'thenMSComm1.CommPort:=1
else
MSComm1.CommPort:=2:
MSComml.Handshaking:-CommOption.handshake://设置握手协议end:
procedure TfrmCommTest.chkSendHexClick(Sender: TObject);var bChk:boolean;
str:string:
bcgin
ifchkSendHex.Checked then //十六进制形式begin
bChk:=truc;
end
else //字符串形式
begin
bChk:=false;
end;
str:=ConvertHexChar(memSend.TextbChk);
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):memRecv.Clear;
memRecv.Text:=str,
end;
//发送数据
procedure TfrmCommTest,SendData:
var str:string!
begin
str-"
if not MSComml.PortOpen then//串口未打开
begin
MessageDlg(请先打开串口!mtInformation,[mbOk],0):
exit;
end
else /mp:oleV
begin
if memSend.Text=" then
MessageDlg(请输入需要发送的数据!mtInformation,[mbOk],0);
str:=memSend.Text:
sumSend:=sumSend+length(str);
MSComm1Output:=str.
edit2.Text;=inttostr(sumSend):
end:
end;
//接收数据
procedure TfirmCommTest.RecvData;
var s:string
VTmp: Variant;
ovTmp:oleVariant:
iiRecv:integer;
bTmp:Byte;
bcgin
ifMSComml.InputMode=ComInputModeText then//文本形式
bcgin
iRecv:=MSComm1.InBufferCount:
s-MSComm1.Input;
if chkAutoClear.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);VImp:=ovTmp;
版权所有:江苏和讯自动化设备有限公司所有 备案号:苏ICP备2022010314号-1
技术支持: 易动力网络