FX2N与MODBUS-RTU通讯出现问题了 点击:1848 | 回复:11



medco501

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 49回
  • 年度积分:0
  • 历史总积分:143
  • 注册:2008年1月12日
发表于:2011-04-21 16:45:32
楼主

PLC是和温控仪表做的,设置M8161=ON为8位模式,数据读出,当目标值在0~255之间时和仪表显示值一致,当不在这个范围内时出现错误,读出值和仪表上显示值不一致,我发现还是跟8位模式有关,当错误值加减255时又和仪表显示值一样了。

理论上讲如果是8位模式,通讯时是将目标值的16BIT拆成高低8位分开传输的,接收后要做处理才能恢复使用;只需将装目标值高8位的那个寄存器上下字节对调(SWAP指令),再跟装目标值低8位的寄存器做或运算(WOR指令)就能把原始目标值恢复出来,但是这样运算出来的值根本就不对!不知哪位大侠有没有碰到过相同的问题啊??还请赐教一二!!!

最后强烈鄙视一下三菱!!做个MODBUS指令会死啊!!!




yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-21 18:07:19
1楼

如果是RTU模式通讯,记得返回的数值不需要上、下调换,只有CRC的校验码是需要高、低调换。

假如返回的寄存器D10、D11,其中D10=H13,D11=H88

按本人的理解:将D10左移8位,然后D10再和D11作或运算(WOR),其结果应该=H1388

以上看法不知是否正确,供参考。

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-21 18:26:27
2楼

以下部分程序来自网上,是ABB变频的RTU通讯程序,返回数据(频率)寄存器分别是:D113、D114,合并处理后的寄存器是D174

medco501

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 49回
  • 年度积分:0
  • 历史总积分:143
  • 注册:2008年1月12日
发表于:2011-04-21 18:52:55
3楼

如果是RTU模式通讯,记得返回的数值不需要上、下调换,只有CRC的校验码是需要高、低调换。

假如返回的寄存器D10、D11,其中D10=H13,D11=H88

按本人的理解:将D10左移8位,然后D10再和D11作或运算(WOR),其结果应该=H1388

以上看法不知是否正确,供参考。
======================================

多谢大哥回复啊!这么说D10是高字节了?我把D11当高字节了,明天去公司再试试看!

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-21 19:02:42
4楼

三菱应该可以作MODBUS-RTU,不知你的程序为何会死。

本人前几天刚用FX-1S作RTU通讯,没看出有什么不对的地方。

yzyhjz

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 16回
  • 年度积分:0
  • 历史总积分:130
  • 注册:2010年9月18日
发表于:2011-04-22 21:35:44
5楼
yjig:
如果是RTU模式通讯,记得返回的数值不需要上、下调换,只有CRC的校验码是需要高、低调换。

假如返回的寄存器D10、D11,其中D10=H13,D11=H88

按本人的理解:将D10左移8位,然后D10再和D11作或运算(WOR),其结果应该=H1388

以上看法不知是否正确,供参考。
=================================================================================
 
指令ROL,当m8奇数次触发时,显示频率=H1388,可是偶数次触发时,显示频率=H13+H88了,这样就不对了,因为指令ROL当m8由OFF-----ON一次,就左移位一次

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-22 23:39:23
6楼

谢谢楼上指正,以上程序是复制网上的,传上来是为了说明数据的合成,还没在意存在以上问题。

刚在查看了原程序,才发现程序中M8线圈是采用了上升沿---PLS   M8,因此不会发生以上问题。

再次谢谢楼上网友提醒更正。

medco501

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 49回
  • 年度积分:0
  • 历史总积分:143
  • 注册:2008年1月12日
发表于:2011-04-23 11:21:50
7楼

搞定了!但出现个令人费解的现象,我发出去的数据是01 03 00 01 00 01 85 E2,理论上应该回传01 03 00 01 XX XX CX CY这样一串数据,CX CY为CRC码,但实际回传的是01 03 02 XX XX YY CX CY,我试过回传的数据和仪表显示值始终是一致的,不管它怎么变化,但这个YY是什么东东?而且它也一直在变化,这仪表在搞什么灰机啊!难道是8位模式导致的?

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 11:49:41
8楼

以下图片是台达变频RTU通讯协议的一部分,从图中协议可看出,发出与返回的数据是不同的:

你的发出数据:

01 03 00 01 00 01 85 E2     你的85前的00  01 表示读一个字的数据,

你的返回数据:

01 03 02 XX XX YY CX CY    你的01  03后面的02表示返回数据内容有2个字节(对应以上的读一个字)。

如果你需要读2个字,也就是说与图片一样,那么返回的数据内容就是4个字节。

以上看法供参考。

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 12:17:51
9楼

至于楼上说的YY是什么东西,我估计:可能与被读仪器内部程序相关,我查看了许多厂家的RTU协议,所看到的协议都是读2个以上的字,还没见过读一个字的。按上图事例:读2个字,那么一共返回9个字节。

如果按楼主要求,仅仅读一个字,那么理应返回7个字节,而楼主实际返回了8个字节,比需要的多了一个,本人估计,是否可这样认为,仪器的设计人在编制程序时,处理7个字节可能比较麻烦,为了方便,全部按8个以上字节考虑,所多余的一个字节,可能是下一个寄存器的一部分。

以上看法供参考,欢迎高手指正!

 

medco501

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 49回
  • 年度积分:0
  • 历史总积分:143
  • 注册:2008年1月12日
发表于:2011-04-23 12:33:16
10楼

至于楼上说的YY是什么东西,我估计:可能与被读仪器内部程序相关,我查看了许多厂家的RTU协议,所看到的协议都是读2个以上的字,还没见过读一个字的。按上图事例:读2个字,那么返回一共10个字节。

如果按楼主要求,仅仅读一个字,那么理应返回7个字节,而楼主实际返回了8个字节,比需要的多了一个,本人估计,是否可这样认为,仪器的设计人在编制程序时,处理7个字节可能比较麻烦,为了方便,全部按8个以上字节考虑,所多余的一个字节,可能是下一个寄存器的一部分。

以上看法供参考,欢迎高手指正!

=====================================

知道了,yjig大哥你太热心了,分数给你吧,谢谢啦!!!哈哈

yjig

  • 精华:2帖
  • 求助:5帖
  • 帖子:97帖 | 5237回
  • 年度积分:0
  • 历史总积分:12514
  • 注册:2004年6月04日
发表于:2011-04-23 12:47:57
11楼
谢谢楼主,过奖了,其实本人也是新手,刚刚学会RTU通讯,仅不过借此平台共同提高。

热门招聘
相关主题

官方公众号

智造工程师