回复:如何将某个字节VB**的最低7位和最高位分别读出,并分别转换成另外两个字节??

已锁定

Zaxife

  • 帖子

    2450
  • 精华

    31
  • 被关注

    78

论坛等级:至圣

注册时间:2008-07-24

普通 普通 如何晋级?

发布于 2021-01-21 14:47:11

6楼

展开查看
以下是引用sdzcl在2021-01-18 13:34:42的发言 >3楼

仪表厂家提供的部分协议内容:

微信图片_20210118132656.png

微信图片_20210118132704.png

微信图片_20210118132704.png

微信图片_20210118132700.png

微信图片_20210118132651.png

用MODSCN32软件测试,读取协议中起始地址为:0Xa006的指令时,可以读出实际数值:

微信图片_20210118132759.jpg

根据上面的测试结果,读指令应该是是不是从“440961"开始?

另外,我知道单独取字节中的位值,但用什么指令可以将低位的七个位取出,再转换成另外一个数?

衷心感谢您的指点,比其他高手模棱两可的说教实用多了!!!

以下是引用Zaxife在2021-01-18 13:15:59的发言 >2楼:0xA000这种Modbus...

引用2楼详细内容:

0xA000这种Modbus通讯地址是输出线圈,也就是位变量,你确定厂家的资料没错?用位变量来传输8个位的内容?

3xA000 、4xA000这些才是字存储的寄存器。


如果读取的是线圈,则读取地址是 40960(A000),如果读取的是输入寄存器则是340960,如果读取的是保持寄存器则是440960。还有国内很多厂家都不按标准Modbus地址编号的,所以实际的地址有可能是40959?40960?40961。这种乱七八糟的情况我在用第三方Modbus外设就都碰到过,不稀奇。


至于拆分寄存器的高低字节?可以直接取就可以了,不用特意转换。比如读取的内容放在VW100,那么VB100就是高字节、VB101就是低字节。如果VW100=16#1234,那么VB100=16#12、VB101=16#34。

最位也可以直接用V100.7获取。

Modbus中规定3开头的是输入寄存器,只能读取不能写的,否则Modbus指令会报错吧?

既然你测试出来读取是440961,写也是440961,只有0和4开头的寄存器可以读、写操作。

取一个VB单元的低7位内容,可以用WAND_B指令与16#80得到的值就是了。或者也可以直接把字节的最高位清零。比如取 VB0的低七位内容到VB2,用指令与运算或者最高位清零都可以。



评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8945条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。