发表于:2017/1/7 11:39:42
#0楼
利用PLC的IO点实现串行通信-
0、前言
本文目的主要是深入研究通信原理。其次是针对一些特殊场合,比如不具备通信口的PLC,想要低成本通信组网,或者说距离上较远,一般的通讯不能满足要求,而数据量又不大,实时性要求不高的,如果能利用PLC的普通IO点模拟异步串行通信,则可以节约很大成本。而且该通信方案可以在其他领域推广而不只是PLC,也许有用的到的一天。
对于很多人回复里关注的实用性,我举个例子?我在工厂遇到过一个情况。有两台距离较远的PLC。其中一台小型PLC,有剩余IO输入输出点,没有扩展能力,没有通讯接口。有一台大型PLC,接触摸屏,现在想要通过触摸屏对小型PLC的一些计数值进行显示,并对小型PLC的一些参数进行设置。此时,可以采用这种方法,进行一些通讯,完成这个功能。
一,通信协议
1,单工异步通信硬件结构
该通信系统采用两线制主从机结构,主机端只能发送命令,从机端只能接收命令。对于主机两根发送线,分别接输出点和公共端。对于从机接收线接本机输入点和本机电源公共端,主机输出点,相当于外接开关。 2,全双工异步通信硬件结构
与单工异步通信完全相同,只是互为主机可以进行发送,同时又都是从机。这里研究全双工异步通信系统设计,而半双工异步串行通信是其一部分。如果不是相同电源,一定要注意COM端接线串电源的问题。
3、半双工异步通信硬件结构
可以实现多个PLC之间的通信,但是对电源有要求,同一时间,只可以有一台发送,其他接收。
3,协议内容
由于采用全双工异步串行通信,那么通信协议可以设计成“请求-应答”方式,整体协议内容如下。
起始码+信息长度+指令类别+状态编码+读写选择+地址+数值+校验
举例:请求修改对方D1000寄存器的值为#1234,则发送数据: #FFFF #0006 #0101 #0000 #0505 #03E8 #1234 #FFFF
说明:
〇起始码:一个固定的值,用来判断是否开始接收数据。
①信息长度:是指从指令类别到校验的总字数,这里恒定为6。
②指令类别分:请求指令和应答指令,例如如果是请求指令可以用“#0101”表示,应答指令可以用“#0505”表示。
③状态编码:表示回复信息的内容,是正常内容,还是报警内容,如果是报警内容,则可以根据状态编码知道对方反馈的故障。
④读写选择:区分该指令是对从机的读操作还是写操作。例如读用“#0101”表示,写用“0505”表示。
⑤地址,是指D区的地址号,通信只能通过间接寻址操作D区,如果想要读写对方的D区以外的寄存器区域,需要用D区作为中转。例如想控制CIO0002输出模块,可以通信操作D3000,然后将D3000赋值给CIO0002即可。输入模块读取则反向赋值。
⑥数值,只有在发送写数值请求指令和发送读数值答复指令时才有,读请求指令和写值答复指令可以没有,发送一个无意义的数据。
⑦校验,根据指令内容计算校验码 。
二,信号实现
1、信号定义
①待机信号,输出端取无输出时为待机信号,待机信号为0。接收端闲才允许接收,用标志位表示,1代表忙,0代表闲。开始接收置1,停止接收T1后,为0。停止接收的条件是连续高电平或者连续低电平超过T1,正常情况应该是连续高电平超过T1。
②利用信号反转作为检测。
③利用信号反转间隔作为0和1判断,如果信号反转间隔小于T2,则为0,间隔时间大于T2,则为1。T2要是PLC可以区分的时间。
④综上所述,每次闲的时候,接收第一个反转,为信号起始,下一个反转计时结果开始记录,每次反转都记录,即使干扰也要记录,最新的16个位和起始码进行比较,一旦相同,后面的就是信号,此时信息接收信号置1。
⑤新接收的16位是信息长度,按照该长度,记录后续数字。接收完该数字的长度后,信息接收信号置0。如果信息接收信号为0,T1时间内,又收到信号,则判断为信息粘连,给予故障报警。直到接收信号变为0,清除报警。经过T1时间,没有信号反转则接收完毕,接收标志变0。所以如果发送最后一个字符后是高电平,需要等到超过T1时间反转待机。
⑥所有发送都应该具有应答,发送完指令后,开启应答等待位,如果超过T3时间,未收到应答,则视为断线。
2、信号时间确定
根据PLC的实际运行能力,我们做这样的时间规划
一个bit最长时间30ms,所以最低波特率为33bps。假如0-1平均,则波特率为50bps。0越多,波特率越高,这是一种波特率不固定的传输方式。 发送一条完整指令共8word,共128bit,最多需要4s。
三、PLC编程
1、寄存器占用
发送和接收是分开的,这里是发送和接收全部的寄存器占用。
2、发送程序助记符
' 指令类别:0101请求,0505答复\n状态编码:0000正常,0505故障\n读写选择:0101读,0505写\n地址:十进制地址\n数据:16进制数据
@LD W0.08
MOV(021) #FFFF W28
MOV(021) &6 W27
MOV(021) #0101 W26
MOV(021) #0000 W25
MOV(021) #0505 W24
MOV(021) W33 W23
MOV(021) W32 W22
MOV(021) #FFFF W21
' 串口为0时,且信息没有发送,可以请求发送,停止发送计时器到时,认为发送完毕
%LD W0.08
ANDNOT W0.00
ANDNOT W0.01
OR W0.01
ANDNOT T0000
@ANDNOT W0.08
OUT W0.01
' 5t算发送停止,其他情况,只要串口反转,则重新开始计数-接收端一旦接收超过6t则认为发送停止
LD W0.01
@ANDNOT W0.00
%ANDNOT W0.00
TIMH(015) 0000 #6
' 串口开始发送,设置一个上升,计数器清0
@LD W0.01
SET W0.00
MOV(021) #0 W2
' 串口发送结束,设置一个下降
%LD W0.01
RSET W0.00
' 当前端口状态为1,而应该输出也为1时,如果没有发送完所有为,3t时间后,串口反转,计数器重置
LD W0.00
AND W29.00
AND<(310) T0 #3
AND<=(315) W2 &128
RSET W0.00
MOV(021) #6 T0
' 当前端口状态为1,而应该输出也为0时,需要1t后,串口反转
LD W0.00
ANDNOT W29.00
AND<(310) T0 #5
AND<=(315) W2 &128
RSET W0.00
MOV(021) #6 T0
' 当前端口状态为0,而应该输出也为1时,需要3t后,串口反转
LDNOT W0.00
AND W29.00
AND<(310) T0 #3
AND<=(315) W2 &128
SET W0.00
MOV(021) #6 T0
' 当前端口状态为0,而应该输出也为0时,需要1t后,串口反转
LDNOT W0.00
ANDNOT W29.00
AND<(310) T0 #5
AND<=(315) W2 &128
SET W0.00
MOV(021) #6 T0
' 串口反转,则读入下一个数据到发送位
@LD W0.00
%OR W0.00
OUT TR0
++(590) W2
LD TR0
LD P_Off
SFT(010) W21 W29
3、接收程序助记符
' 启动接收条件:没有接收时,遇到上升沿-停止接收条件:接收定时器到时-
LDNOT W1.01
@AND W1.00
OR W1.01
ANDNOT T0001
OUT W1.01
' 接收中,遇到串口信号反转,记录反转的时差,小于2t为0,大于2t为1
@LD W1.00
%OR W1.00
AND W1.01
OUT TR0
AND>=(325) T1 #3
RSET W1.08
LD TR0
AND<(310) T1 #3
SET W1.08
' 将收到的数据位移位进入接收缓存-每次开始接收时,要清缓存
LD W1.08
@LD W1.00
%OR W1.00
AND W1.01
@LD W1.01
SFT(010) W41 W48
' 开始接收时,开启接收定时器,每次遇到信号反转,重置定时器-发送信号最长为3t,所以定时5t,认为发送结束-
LD W1.01
@ANDNOT W1.00
%ANDNOT W1.00
TIMH(015) 0001 #5
' 接收完成,执行相应的指令要求
%LD W1.01
AND=(300) W46 #0101
AND=(300) W44 #0505
MOV(021) W43 D0
MOV(021) W42 @D0
0、前言
本文目的主要是深入研究通信原理。其次是针对一些特殊场合,比如不具备通信口的PLC,想要低成本通信组网,或者说距离上较远,一般的通讯不能满足要求,而数据量又不大,实时性要求不高的,如果能利用PLC的普通IO点模拟异步串行通信,则可以节约很大成本。而且该通信方案可以在其他领域推广而不只是PLC,也许有用的到的一天。
对于很多人回复里关注的实用性,我举个例子?我在工厂遇到过一个情况。有两台距离较远的PLC。其中一台小型PLC,有剩余IO输入输出点,没有扩展能力,没有通讯接口。有一台大型PLC,接触摸屏,现在想要通过触摸屏对小型PLC的一些计数值进行显示,并对小型PLC的一些参数进行设置。此时,可以采用这种方法,进行一些通讯,完成这个功能。
一,通信协议
1,单工异步通信硬件结构
该通信系统采用两线制主从机结构,主机端只能发送命令,从机端只能接收命令。对于主机两根发送线,分别接输出点和公共端。对于从机接收线接本机输入点和本机电源公共端,主机输出点,相当于外接开关。 2,全双工异步通信硬件结构
与单工异步通信完全相同,只是互为主机可以进行发送,同时又都是从机。这里研究全双工异步通信系统设计,而半双工异步串行通信是其一部分。如果不是相同电源,一定要注意COM端接线串电源的问题。
3、半双工异步通信硬件结构
可以实现多个PLC之间的通信,但是对电源有要求,同一时间,只可以有一台发送,其他接收。
3,协议内容
由于采用全双工异步串行通信,那么通信协议可以设计成“请求-应答”方式,整体协议内容如下。
起始码+信息长度+指令类别+状态编码+读写选择+地址+数值+校验
举例:请求修改对方D1000寄存器的值为#1234,则发送数据: #FFFF #0006 #0101 #0000 #0505 #03E8 #1234 #FFFF
说明:
〇起始码:一个固定的值,用来判断是否开始接收数据。
①信息长度:是指从指令类别到校验的总字数,这里恒定为6。
②指令类别分:请求指令和应答指令,例如如果是请求指令可以用“#0101”表示,应答指令可以用“#0505”表示。
③状态编码:表示回复信息的内容,是正常内容,还是报警内容,如果是报警内容,则可以根据状态编码知道对方反馈的故障。
④读写选择:区分该指令是对从机的读操作还是写操作。例如读用“#0101”表示,写用“0505”表示。
⑤地址,是指D区的地址号,通信只能通过间接寻址操作D区,如果想要读写对方的D区以外的寄存器区域,需要用D区作为中转。例如想控制CIO0002输出模块,可以通信操作D3000,然后将D3000赋值给CIO0002即可。输入模块读取则反向赋值。
⑥数值,只有在发送写数值请求指令和发送读数值答复指令时才有,读请求指令和写值答复指令可以没有,发送一个无意义的数据。
⑦校验,根据指令内容计算校验码 。
二,信号实现
1、信号定义
①待机信号,输出端取无输出时为待机信号,待机信号为0。接收端闲才允许接收,用标志位表示,1代表忙,0代表闲。开始接收置1,停止接收T1后,为0。停止接收的条件是连续高电平或者连续低电平超过T1,正常情况应该是连续高电平超过T1。
②利用信号反转作为检测。
③利用信号反转间隔作为0和1判断,如果信号反转间隔小于T2,则为0,间隔时间大于T2,则为1。T2要是PLC可以区分的时间。
④综上所述,每次闲的时候,接收第一个反转,为信号起始,下一个反转计时结果开始记录,每次反转都记录,即使干扰也要记录,最新的16个位和起始码进行比较,一旦相同,后面的就是信号,此时信息接收信号置1。
⑤新接收的16位是信息长度,按照该长度,记录后续数字。接收完该数字的长度后,信息接收信号置0。如果信息接收信号为0,T1时间内,又收到信号,则判断为信息粘连,给予故障报警。直到接收信号变为0,清除报警。经过T1时间,没有信号反转则接收完毕,接收标志变0。所以如果发送最后一个字符后是高电平,需要等到超过T1时间反转待机。
⑥所有发送都应该具有应答,发送完指令后,开启应答等待位,如果超过T3时间,未收到应答,则视为断线。
2、信号时间确定
根据PLC的实际运行能力,我们做这样的时间规划
一个bit最长时间30ms,所以最低波特率为33bps。假如0-1平均,则波特率为50bps。0越多,波特率越高,这是一种波特率不固定的传输方式。 发送一条完整指令共8word,共128bit,最多需要4s。
三、PLC编程
1、寄存器占用
发送和接收是分开的,这里是发送和接收全部的寄存器占用。
2、发送程序助记符
' 指令类别:0101请求,0505答复\n状态编码:0000正常,0505故障\n读写选择:0101读,0505写\n地址:十进制地址\n数据:16进制数据
@LD W0.08
MOV(021) #FFFF W28
MOV(021) &6 W27
MOV(021) #0101 W26
MOV(021) #0000 W25
MOV(021) #0505 W24
MOV(021) W33 W23
MOV(021) W32 W22
MOV(021) #FFFF W21
' 串口为0时,且信息没有发送,可以请求发送,停止发送计时器到时,认为发送完毕
%LD W0.08
ANDNOT W0.00
ANDNOT W0.01
OR W0.01
ANDNOT T0000
@ANDNOT W0.08
OUT W0.01
' 5t算发送停止,其他情况,只要串口反转,则重新开始计数-接收端一旦接收超过6t则认为发送停止
LD W0.01
@ANDNOT W0.00
%ANDNOT W0.00
TIMH(015) 0000 #6
' 串口开始发送,设置一个上升,计数器清0
@LD W0.01
SET W0.00
MOV(021) #0 W2
' 串口发送结束,设置一个下降
%LD W0.01
RSET W0.00
' 当前端口状态为1,而应该输出也为1时,如果没有发送完所有为,3t时间后,串口反转,计数器重置
LD W0.00
AND W29.00
AND<(310) T0 #3
AND<=(315) W2 &128
RSET W0.00
MOV(021) #6 T0
' 当前端口状态为1,而应该输出也为0时,需要1t后,串口反转
LD W0.00
ANDNOT W29.00
AND<(310) T0 #5
AND<=(315) W2 &128
RSET W0.00
MOV(021) #6 T0
' 当前端口状态为0,而应该输出也为1时,需要3t后,串口反转
LDNOT W0.00
AND W29.00
AND<(310) T0 #3
AND<=(315) W2 &128
SET W0.00
MOV(021) #6 T0
' 当前端口状态为0,而应该输出也为0时,需要1t后,串口反转
LDNOT W0.00
ANDNOT W29.00
AND<(310) T0 #5
AND<=(315) W2 &128
SET W0.00
MOV(021) #6 T0
' 串口反转,则读入下一个数据到发送位
@LD W0.00
%OR W0.00
OUT TR0
++(590) W2
LD TR0
LD P_Off
SFT(010) W21 W29
3、接收程序助记符
' 启动接收条件:没有接收时,遇到上升沿-停止接收条件:接收定时器到时-
LDNOT W1.01
@AND W1.00
OR W1.01
ANDNOT T0001
OUT W1.01
' 接收中,遇到串口信号反转,记录反转的时差,小于2t为0,大于2t为1
@LD W1.00
%OR W1.00
AND W1.01
OUT TR0
AND>=(325) T1 #3
RSET W1.08
LD TR0
AND<(310) T1 #3
SET W1.08
' 将收到的数据位移位进入接收缓存-每次开始接收时,要清缓存
LD W1.08
@LD W1.00
%OR W1.00
AND W1.01
@LD W1.01
SFT(010) W41 W48
' 开始接收时,开启接收定时器,每次遇到信号反转,重置定时器-发送信号最长为3t,所以定时5t,认为发送结束-
LD W1.01
@ANDNOT W1.00
%ANDNOT W1.00
TIMH(015) 0001 #5
' 接收完成,执行相应的指令要求
%LD W1.01
AND=(300) W46 #0101
AND=(300) W44 #0505
MOV(021) W43 D0
MOV(021) W42 @D0
[此贴子已经被作者于2017/1/7 14:21:54编辑过]