这几天测试西门子200PLC和组态王自由口方式进行通信。
因为以前没做过这方面的通信,组态王也只熟悉一点,所以网上找点资料看看。
原以为很简单的通信,感觉就是触摸屏和PLC通信那样,简单配置一下参数:地址、波特率等。
现在看来还真是差不多,只是要看的资料很多,结合起来看,弄清楚两者之间的通信协议。
明白之后就很简单。
整理下测试程序和大家分享下,欢迎指导,学习,分享。
(1)下图是西门子200PLC编程软件STEP7的通信端口设置:和组态王里面设置要一致;
(2)下图是PLC编程 STEP7,需要下载亚控的一个初始化程序。
测试程序如下:
测试地址如下:
(3)下图是组态王KingView操作:
和PLC中的一致:
数据词典的操作
定义变量:
测试画面制作:
(4)下图是两者通信的截图:
(5)总结
组态王和200PLC之间协议
选取其中一点,这个没怎么看懂,欢迎大家指导。
上位机发送读指令:
BYTE1: PLC地址 (1~255)
BYTE2: 0x00 (读指令代码)
BYTE3: 寄存器类型(0-V, 1-Q, 2-I)
BYTE4-5: 起始偏移地址(0-9999)
BYTE6: 数据个数(1~32 n)
BYTE7: 数据类型(1,2,4 m)
BYTE8-11: 保留
BYTE12: 校验字节
PLC应答:
读成功时:
BYTE1: PLC地址 (1~255)
BYTE2: 0x00 (读指令代码)
BYTE3: 寄存器类型(0-V, 1-Q, 2-I)
BYTE4-5: 起始偏移地址(0-9999)
BYTE6: 数据个数(1~32 n)
BYTE7: 数据类型(1,2,4 m)
BYTE8-n*m+8: 数据
BYTEn*m+9: 校验字节
MAIN
LD SM0.1
CALL SBR_0:SBR0 //初始化子程序
LD SM0.7
= SM30.0
SBR_0:初始化子程序SUBROUTINE COMMENTS Press F1 for help and example program
LD SM0.0
MOVW +2, VW8 //PLC自由口地址,此处每台机器需设不同的地址
LD SM0.0
MOVB 9, SMB30 //通讯参数,波特率9600,自由口通讯
MOVD &VB100, VD40// VB100:接收缓冲区的首字节
MOVW +10, VW54// VW54:存放发送数据按字节异或校验的次数,10次校验完已//接收了11个字节了,最后一个12号字节是校验。
MOVB 12, VB150
MOVB VB9, VB151// VB151赋以本机地址
MOVD &VB151, VD60// 发送首地址VD60赋以地址
MOVB 6, SMB34
ATCH INT_0:INT0, 10
ATCH INT_1:INT1, 8
ENI
INT_0://用作初始化几个参数。每次接受新一帧数据前调用,完了就进入INT_2(接受地址,//并判断,)
LD SM0.0
DTCH 10
MOVD VD40, VD46//初始化 VD46为VD40
MOVW +10, VW44//初始化异或校验的次数
MOVW +10, VW54//初始化异或校验的次数
ATCH INT_2:INT2, 8 //接受中断起用服务程序INT2
INT_1://延时转向INT0//网络正常时这里应该很少调用
LD SM0.0
MOVB 5, SMB34
ATCH INT_0:INT0, 10
INT_2:接受地址,并判断
LDB= SMB2, VB9 //地址和本机相符
MOVW VW8, AC0// AC0这时存入的是本机地址
MOVB 255, SMB34//255MS的长延时监控,如超过将做异常处理回到初始化重新再来接//收,要知道传送一个字节是毫秒级的。就是200字节左右看做异常
ATCH INT_3:INT3, 8 //起用中断服务INT3,接受包
ATCH INT_5:INT5, 10 //起用延时监控服务INT5
CRETI
LDB= SMB2, VB9 //地址和本机不符
NOT
ATCH INT_0:INT0, 10 //返回中断入口
ATCH INT_1:INT1, 8
INT_3://主接受服务程序,同时做异或校验
LD SM0.0
XORW SMW1, AC0// AC0上次已存入本机地址,这次做第一次异或,记住异或的次数
MOVB SMB2, *VD46// 指针VD46这时指向VB100,即将读写代码存入VB100
INCD VD46//指针VD46指向VB101
DECW VW44//异或的次数VW44-1=10-1=9
LD SM1.0 //完成预定的接受字节数//10次异或完就接收11
//个字节,一桢是12个字节,第12字节是校验位,
ATCH INT_4:INT4, 8 //起用通讯数据处理主程序//第12字节交INT4比较//处理
INT4://通讯数据处理主服务程序
LD SM0.0
BMB VB100, VB152, 6//接受报头拷贝到发送报头// VB100存读写代码,VB151赋以本
//机地址,VB152存读写代码
LD SM0.0
DTCH 8 //暂停响应接受中断
INCD VD46// VD46这时指向VB111,
MOVB SMB2, *VD46//校验位存入*VD46即VB111
XORW SMW1, AC0// AC0是前11个字节的异或
ANDW 16#FF, AC0 //检查异或校验
LDN SM1.0 //异或校验错误
MOVB VB100, AC0// VB100存读写代码
MOVB 16#80, AC1
ORW AC0, AC1//这步运算,如读AC1=0X80,如写AC1=0X81
MOVB AC1, VB152// VB152存入发送帧的BYTE2,VB151是BYTE1:本机地址
MOVB 16#1, VB158// VB158:BYTE8: 0x01(校验错代码)
MOVW +10, VW54//10次异或的次数
JMP 3 //校验错误,向PC返回错误码
LD SM1.0 //异或正确//两数相同异或结果=0,很好理解
MOVW +4, VW34
ATCH INT_8:INT8, 8 //起用服务程序INT8响应接受中断,接受包尾
LD SM0.0 //数据处理