台达PLC与单片机的通讯
最近由于工作需要用PLC与单片机通讯,以此用PLC来控制单片机,使单片机作为一个IO扩展模块来使用。这是第一次尝试自己写代码来使两个器件通讯,故在此做一下笔记,顺便巩固一下在这个过程中所学到的知识。
本次使用的PLC型号是台达的DVP26SE11T,通过基于RS485的MODBUS协议连接单片机,使用MODBUS的RTU模式,把PLC作为主机,单片机作为从机。
一、首先需要把PLC的通讯和单片机的通讯设置一致,本次实验中的单片机的通讯格式为:波特率 115200、奇偶校验无、数据位 8、停止位 1 ,所以PLC的通讯格式也应设成相同,以下是PLC的通讯设置代码
M1002:开启正向 (RUN 的瞬间’On’) 脉冲
D1120:COM2 (RS-485) 通讯格式设定
M1120:COM2(RS-485)通讯格式保持用,设置后变更 D1120 无效
D1129:COM2(RS-485) RS-485 通讯逾时异常设置 (ms)
M1143:COM2(RS-485)的 ASCII/RTU 模式选择 (Off 时为 ASCII 模式 On 时为 RTU 模式)
M1161:8/16 位处理模式 (On = 8 处理模式)
其中D1120的设置:
根据PLC的手册,D1120 是本PLC设定485通讯口通讯格式的寄存器,设定格式如下图:
根据单片机的通讯格式 :波特率 115200、奇偶校验无、数据位 8、停止位 1 ,b15~b1应该为0000 0000 1100 0001,转化为16进制即为00C1,故D1120设置为16#00C1。
二、之后是控制接发数据,本实验直接读取和发送多笔数据,所以只用到H03(读取多笔字符(Word)装置)和H10(多笔字符(Word)装置数据写入) 两个功能码。这里需要注意,PLC与单片机的功能码需要通用,如果对功能码的定义不一样,则不能准确的发送接收数据。
代码如下:
其中的MODRW 功能:MODBUS 读写数据
接收数据代码解析:
S1:单片机作为从站,通讯地址为0X01,所以PLC作为主机通讯地址也需要设置为0X01,所以S1设置为16#0001(H0001);
S2:要接收单片机的多个点位,用到功能码H03(读取多笔字符(Word)装置),所以S2设置为16#0003(H0003);
S3:本次实验用到的单片机有16个输入,根据单片机的MODBUS协议,读取16个输入点位的地址为0X00FF,所以S3设置为16#00FF(H00FF)
S:因为PLC自带设置了MODRW指令读取的数据的寄存器(D1296~D1311),D1296~D1311所以这个数据用不上,可以随意设置一个空寄存器;
在 ASCII 或 RTU 模式,PLC COM2 会将传送出去的数据储存在 D1256~D1295,而且回传的 数据会被储存在 S 操作数开始连续的寄存器中,并且自动将转换后的 Hex 数值后储存 D1296~D1311
N:读取的数据长度为1
写入数据代码解析:
S1:单片机作为从站,通讯地址为0X01,所以PLC作为主机通讯地址也需要设置为0X01,所以S1设置为16#0001(H0001);
S2:要接收单片机的多个点位,用到功能码H10(多笔字符(Word)装置数据写入),所以S2设置为16#0010(H0010);
S3:本次实验用到的单片机有16个输出,根据单片机的MODBUS协议,写入16个输入点位的地址为0X00FF,所以S3设置为16#00FF(H00FF)
S:把D50作为写入的寄存器,在D50内设置数值,即可控制输入;
N:写入的数据长度为1
三、最后是处理接法数据
处理发送数据
把K4M2000赋值给D50,这样通过控制M2000~M2015的值即可控制单片机的16个输出。例如假设要使单片机的Y4,Y8,Y11,Y15的LED灯亮灯(有输出),那么M2000~M2015的值需要分别为0001 0001 0010 0010,则K4M2000的值为4386(十进制),那么D50为K4386(二进制0001 0001 0010 0010),这样就可在PLC程序中通过控制M2000~M2015来控制单片机的Y1~Y16了。
处理接收数据
将MODRW指令通过功能码读到存在D1296里的数据赋值给K4M3000,这样M3000~M3015即可以表示X1~X16的值。例如当D1296的值为8481(十进制),那么K4M3000为K8481,M3000~M3015的值分别为 0010 0001 0010 0001,表示单片机板上的X1~X16的值分别为0010 0001 0010 0001,说明这时单片机板的输入状态为X3, X8, X11, X16的LED灯亮(有输入),其他点的LED灯灭(无输入),这样就可以通过M3000~M3015的状态来判断X1~X16的状态了。
四、综上所述,用PLC控制单片机的输入输出,使其作为一个IO扩展模块来使用是可行的。
总结:
1.使用MODBUS协议来通讯时,两个通讯元件之间的通讯格式需要设置成一样;
2.通过MODBUS协议使两元件通讯时,功能码的定义一定要一致。