点击上方"深圳智控科技"↑关注我们
松下PLC与PC机的通用通讯
PLC和PC机的通信,是普遍遇到的一种应用场景,对于大部分的开发者来说,实现松下协议有些复杂,现实首选的通信方式为通用协议,当利用winpro的IEC编程环境时,可以灵活的使用ST开发语言,开发出复杂的应答通信协议。
系统硬件组成和连接
1丶FPX-C30T为系统的核心组成。
2丶PLC使用自带的COM0。
3丶松下的5针通信电缆用于和PC机的串口通信。
4丶PC机采用市售的USB转232口和松下的串口线连接。
项目的建立和配置
项目的建立,选择PLC和开发语言如下
串口配置如下
PLC和PC之间的通讯协议和数据定义
命令采用定长帧,PC为主,PLC为从,所有的帧都是采用应答的方式。
帧格式如下
PC机发送帧,长度为固定20个字节
帧头 命令 命令附加数据 LRC校验
0x25 0x25 cmdL cmdHdata0 ... Data13 LRCL LRCH
动作
|
cmd指令代码
|
动作1
|
0x0001
|
动作2
|
0x0002
|
动作3
|
0x0003
|
PLC应答帧,长度为固定的6个字节
帧头 应答命令 LRC校验
0x25 0x25 cmdLcmdH LRCL LRCH
正确应答时为PC机发送的命令,目前唯一的错误应答命令为0x0080帧校验错误。
帧头为固定的0x25 0x25,方便帧头定位。
程序说明
思路:
收字符是系统后台自动进行的,PLC程序判断收到的字符,如果字符不为帧头,0x25 0x025,则清除缓存,如果帧头则等收到20个字节后,首先判断校验码,如果校验码正确,则根据cmd指令做动作并应答,如果校验错误,则反馈给PC帧错误应答。
LRC:
除帧头之外有效16位数据的累加和
lrc := 0;
fori := 1to8by1do
lrc := lrc + recvbuff;
end_for;
如何清除接受缓存:
使用ClearReceiveBuffer(SYS_TOOL_PORT):
如何判断收到的字符长度:
接受缓存的第一个字为收到的字符长度,例如DT100为接受缓存起始的话,那么DT100中就是接收到的字符长度。
如何发送字符:
使用函数
SendData(Port := SYS_TOOL_PORT, Start := sendbuff[0], NumberOfBytes := 6);
注意sendbuff[0]为发送字符的剩余数量,所以真正开始的字符要从sendbuff[1]开始。
从上面可以看到,winpro的开发非常类似于c语言或者basic语言的开发方式,函数指令也是很人性化的命名方式,便于开发者的记忆和使用。
程序代码
(*初始化发送字符数组 *)
if(sys_bIsFirstScan) then
fori := 0to9by1do
sendbuff := 0;
end_for;
end_if;
(* 收到的字符串 *)
if (recvbuff[0] >= 2) then
(* 如果收到的字符不为协议的起始,则清除收到的缓存 *)
if (recvbuff[1] <>16#2525) then
ClearReceiveBuffer(SYS_TOOL_PORT);
elsif (recvbuff[0] = 18) then
(* 正确,则校验后处理 *)
lrc := 0;
fori := 1to8by1do
lrc := lrc + recvbuff;
end_for;
if (lrc = recvbuff[9]) then
if (recvbuff[1] = 16#0001) then
(* 动作1处理,略*)
(* 应答pc机 *)
sendbuff[0] := 6;
sendbuff[0] := 16#2525;
sendbuff[1] := 16#0001;
sendbuff[2] := 16#0001;
SendData(Port := SYS_TOOL_PORT, Start := sendbuff[0], NumberOfBytes := 6);
elsif (recvbuff[1] = 16#0002) then
(* 动作2处理,略*)
(* 应答pc机 *)
sendbuff[0] := 6;
sendbuff[0] := 16#2525;
sendbuff[1] := 16#0002;
sendbuff[2] := 16#0002;
SendData(Port := SYS_TOOL_PORT, Start := sendbuff[0], NumberOfBytes := 6);
elsif (recvbuff[1] = 16#0003) then
(* 动作3处理,略*)
(* 应答pc机 *)
sendbuff[0] := 6;
sendbuff[0] := 16#2525;
sendbuff[1] := 16#0003;
sendbuff[2] := 16#0003;
SendData(Port := SYS_TOOL_PORT, Start := sendbuff[0], NumberOfBytes := 6);
end_if;
else
(* 应答lrc错误 *)
sendbuff[0] := 6;
sendbuff[0] := 16#2525;
sendbuff[1] := 16#0080;
sendbuff[2] := 16#0080;
SendData(Port := SYS_TOOL_PORT, Start := sendbuff[0], NumberOfBytes := 6);
end_if;
ClearReceiveBuffer(SYS_TOOL_PORT);
end_if;
end_if;
文章版权归深圳市智控科技有限公司所有,转载请注明出处。
深圳市智控科技有限公司创建于2005年,致力于提供智能化、全方位、多层次的运动控制系统。代理产品有:
回复查看更多产品资讯
回复1或松下查看:松下产品信息
回复2或TOYO查看:台湾东佑达产品信息
回复3或步进查看:步进电机产品信息
回复4或电缸查看:大雅电缸产品信息
回复5或视觉查看:视觉检测相关信息
回复6或运动查看:运动控制器/卡相关信息
Tel:0755-27833360 27857851
官网:www.stonker.com.cn
微信号:zhikongkeji
|