我有一个西门子s7-200的PLC,还有两台,台达的变频器,我要用modbus通信,但是不知道怎么编写程序.请大家帮帮我,
谢谢!
最佳答案
1.要了解一下PLC自由口通信知识
2.了解modbus协议.
那就可以自己编了,要有个CRC校验程序.我提供一下吧.当然如果用modbus的库那就简单了.西门子的人已经给你编好了.
SUBROUTINE_BLOCK CRC:SBR99
TITLE=CRC域是两个字节,包含一16位的二进制值。它由传输设备计算后加入到消息中。接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
// CRC是先调入一值是全"1"的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。仅每个字符中的8Bit数据对CRC有效,起始位和停止位以及奇偶校验位均无效。
// CRC产生过程中,每个8位字符都单独和寄存器内容相或(OR),结果向最低有效位方向移动,最高有效位以0填充。LSB被提取出来检测,如果LSB为1,寄存器单独和预置的值或一下,如果LSB为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的CRC值。CRC添加到消息中时,低字节先加入,然后高字节。
// 注意:
// CRC添加到消息中时,低字节先加入,然后高字节。如:
// MOVB CRC_Hi, VB8
// MOVB CRC_Lo, VB7
//
//
// 调用实例:
// NETWORK 1
// LD SM0.1 //读W458
// MOVB 8, VB0 //发送8个字符
// MOVB 16#01, VB1 //从站地址:01,
// MOVB 16#03, VB2 //命令代码:10 (写变量)
// MOVW +458, VW3 //起始地址:16#01CA(W458) DRIVECOM状态字
// MOVW +1, VW5 //读写长度
// MOVD &VB1, VD60 //建立指针
// CALL CRC, VD60, +6, MB7, MB8 //计算CRC码
//
VAR_INPUT
TabPT:DWORD; // 表头
TabLen:INT; // 字节数
END_VAR
VAR_OUTPUT
CRC_Hi:BYTE; // CRC高字节
CRC_Lo:BYTE; // CRC低字节
END_VAR
VAR
temp_Hi:BYTE;
temp_Lo:BYTE;
temp_Index1:INT;
temp_Index2:INT;
temp_CRC_LSB:BOOL;
END_VAR
BEGIN
Network 1
// CRC初始化为FFFF
LD SM0.0
MOVW 16#FFFF, LW6
Network 2 // 第一个循环为每一个字节进行CRC
// //外循环开始,外循环用与没个信息字节的CRC计算。
LD SM0.0
FOR LW10, +1, LW4
Network 3
LD SM0.0
MOVB 16#00, LB8 //高字节清零
MOVB *LD0, LB9 //信息装入低字节
XORW LW8, LW6 //与CRC进行异或和
Network 4 // //CALL SBR_1, LW6 //CRC
// //内循环开始,内循环用于每个字节各个位的CRC计算
LD SM0.0
FOR LW12, +1, +8 //每个字节共8位
Network 5
// LSB暂存保护起来
LD L7.0 //
= L14.0 //
Network 6
// 字右移一位
LD SM0.0
SRW LW6, 1
Network 7
// 如果CRC右移前最低位是1则与多项式进行异或和
LD L14.0
XORW 16#A001, LW6 //这里使用多项式16
Network 8
// //内循环结束
NEXT
Network 9
// //指针加1,对下一个信息字节进行CRC计算。
LD SM0.0
INCD LD0 //指针加1
Network 10
// //外循环结束
NEXT //外循环结束
Network 11
// CRC添加到消息中时,低字节先加入,然后高字节.(16为的CRC加在消息的末尾占两个字节)
LD SM0.0
MOVB LB7, *LD0 //低字节先加入
INCD LD0 //
MOVB LB6, *LD0 //然后高字节
END_SUBROUTINE_BLOCK
提问者对于答案的评价:
ok
原创文章,作者:ximenziask,如若转载,请注明出处:https://www.zhaoplc.com/plc357767.html