PC使用C#与1214C通信

硬件配置:

1、电脑1台
2、网线1根
3、1214C 1台(V1.02)

软件:
Step basic 7 V10.5 SP2多国语言版
XP专业版

电脑端编程采用C#,开发简单。使用Modbus Tcp协议与PLC通信,C#使用Nmodubs开源C#封装库。
电脑作为Slave,实际上是服务端;PLC做Master端,发起请求,实际上是客户端。

PLC使用Tsend_c和Trcv_c两个指令,发送Modbus命令,并接收数据。
先了解一下Modbus TCP包的结构组成:
字节 0: 事务标识高位 - 通常是0
字节 1: 事务标识低位 - 通常是0
字节 2: 协议标识高位 = 0 - 0表示Mobus协议
字节 3: 协议标识低位 = 0
字节 4: 长度(高位) = 0 (因所有消息长度都小于 256)
字节 5: 长度(低位) = 从第6字节开始数直到末尾
字节 6: 单元标识
字节 7: MODBUS功能码
字节 8: 数据1
.
.
字节 n: 数据n

以上n字节,需要在DB数据块中做好,以供tsend_c指令使用。
发送和接收功能块都需要加上MBAP头(上面字节0到字节6),需要细算MBAP头的字节长度。
如:
PLC发送1个寄存器值16#1234到PC,
第7字节开始填06 00 00 12 34, 06是写单个寄存器(Holding Register),两个00 00表示从地址0开始。需要注意NMODBUS的datastory访问Holding Register数组索引却是从1开始,写0也行,编译会报错。第5字节的数值是命令长度5加上1个字节6,结果是6。计算错了,命令会失败。
DB里一共写12个字节(MBAP头7字节+Modbus 命令5字节)。

PLC写PC,可以不管响应,只要PLC发起请求,PC都会对应给出一个相应。
PLC从PC读1个寄存器值,PC中存储16#1234。
如 请求是 04 00 00 00 01 ,相应是04 02 12 34。DB块要做请求和相应两部分符号。
依旧是MBAP头加Modbus命令。
其他如多个读,多个写与此类似。需要注意1个寄存器是2个Byte字节,C#里是叫ushort无符号短整数。需要注意计算长度值。

将tsend_c拖入程序段,指定连接参数和块参数。
PLC1是1214C,PLC2是未指定。PLC地址填上192.168.0.1,PLC2填PC的IP如192.168.0.10。PLC为建立主动连接,伙伴端口填如3000。 PC的502端口默认是Modbus端口,西门子建议用2000-5000(它这个指PLC和PLC之间),只要端口不冲突就可以了。
块参数是tsend_c的管脚,每个脚都填写上。

需要注意的是Data参数:

包含要发送数据的地址和长度 (TSEND_C)
包含接收数据的起始地址和最大长度 (TRCV_C)
这个是西门子1200手册2011.4上话,也没个举例。
MBAP和Modbus命令的数据块,不要选中“仅符号访问”,否则这个地方就没法填了。
它是这个格式 P#DB2.DBX0.0 BYTE12,P#表示绝对寻址,DB2就是数据块名了,要系统命名的那个,DBX是数据块,0.0是起始地址,Byte 12表示12个字节长度。不同的命令,需要自己数,修改BYTE 12的这个数。长度指定错误,会使结果混乱或者命令不执行。
trcv_c功能块操作相同,它的连接参数可以和tsend_c使用同一个。
ANY 指针分配参数示例,参见西门子
http://support.automation.siemens.com/CN/llisapi.dll/42603286?func=ll&objId=42603287&objAction=csView&nodeid0=10805148&lang=zh&siteid=cseus&aktprim=0&extranet=standard&viewreg=CN&load=treecontent


MBAP和Modbus命令弄清楚,数据块按Any指针赋给功能块的Data管脚,通信就没问题了。
Modbus中文协议PDF网上可以下载。
另外发现,trcv_c执行后,其信号脚一直没有Done输出,不知道什么原因。

个人拙见,请阅者批评指正。


你可能感兴趣的:(c,tcp,C#,db2,basic,byte)