请大家帮帮我.

我有一个西门子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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2021年7月5日
下一篇 2021年7月5日

相关推荐

发表回复

登录后才能评论