请教:MODBUS‘06’单个寄存器写入功能 点击:7363 | 回复:14



Yorktown

    
  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 532回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2002年6月28日
发表于:2006-07-27 08:55:00
楼主
数据格式为 RTU 方式,使用 06 功能是否可以对单个寄存器的某个 位 进行写入?
例如使用 06 指令单独对从站 MODBUS 功能地址 40010 最低4位写入 1011 其余12位不写入。



中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 09:12:00
1楼
计算机发送命令:[设备地址] [命令号06] [需下置的寄存器地址高8位] [低8位] [下置的数据高8位] [低8位] [CRC校验的低8位] [CRC校验的高8位] 
例:[11][06][00][01][00][03][CRC低][CRC高] 
意义如下:
<1>设备地址和上面的相同。
<2>命令号:写模拟量的命令号固定为06。
<3>需下置的寄存器地址高8位,低8位:表明了需要下置的模拟量寄存器的地址。
<4>下置的数据高8位,低8位:表明需要下置的模拟量数据。比如例子中就把1号寄存器的值设为3。
<5>注意此命令一条只能下置一个模拟量的状态。 
设备响应:如果成功把计算机发送的命令原样返回,否则不响应。

中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 09:16:00
2楼
如有疑问请继续跟贴!!

通讯网

  • 精华:11帖
  • 求助:1帖
  • 帖子:431帖 | 10265回
  • 年度积分:0
  • 历史总积分:24711
  • 注册:2004年7月09日
发表于:2006-07-27 10:01:00
3楼
图中红笔圈出的就是给地址0,赋值0,的指令,需要的话,改变你的地址,改变你的赋值。

通讯网

  • 精华:11帖
  • 求助:1帖
  • 帖子:431帖 | 10265回
  • 年度积分:0
  • 历史总积分:24711
  • 注册:2004年7月09日
发表于:2006-07-27 10:09:00
4楼
按你所说的应该发上图红笔圈出的一串字节。

lcx426

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 140回
  • 年度积分:0
  • 历史总积分:144
  • 注册:2005年7月09日
发表于:2006-07-27 10:20:00
5楼
当然是可行的,不过高四位的状态是须要覆盖发送的,个人见解请各位指正

Yorktown

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 532回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2002年6月28日
发表于:2006-07-27 11:35:00
6楼
谢谢各位!那么看起来使用 06 功能指令一次写入就是 8 位,单写某个寄存器的 16 位中的 1 位是不行的。不知我的理解对不对? 

lcx426

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 140回
  • 年度积分:0
  • 历史总积分:144
  • 注册:2005年7月09日
发表于:2006-07-27 11:57:00
7楼
是的,应该以字发送

中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 12:06:00
8楼
可以先用:[11][03],然后做处理当然是只改变你要改变的位了,最后再用:[11][06]写入。简单说就是读取数据--改变数据--写入数据,即可模拟你的按位写。

Yorktown

  • 精华:1帖
  • 求助:0帖
  • 帖子:13帖 | 532回
  • 年度积分:0
  • 历史总积分:768
  • 注册:2002年6月28日
发表于:2006-07-27 12:26:00
9楼
“一族”先生的高见明白了:先用 03 功能读出这个 16 位,而后按要求修改所需的 位 后再用 06 写入就是了。可怜这个 MODBUS 功能地址 40010 是 只写,唉 这个方法可能也不行。谢谢!

中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 12:29:00
10楼
这个我还真忽略了!呵呵!

中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 12:48:00
11楼
对了,03和06对应的是40000开始的地址。不会有问题的阿,我刚查过。一个读一个写

如火

  • 精华:172帖
  • 求助:0帖
  • 帖子:803帖 | 5249回
  • 年度积分:0
  • 历史总积分:0
  • 注册:1900年1月01日
发表于:2006-07-27 12:49:00
12楼
按位写,还是用05号命令写DO点;即使是对保持寄存器而言,读取数据--改变数据--写入数据的方法并不可取.按位操作最好用写DO来做,不要用输入或保持寄存器.

中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 13:09:00
13楼
如果是开关量当然是用05合适,但要是模拟量的话还是用04、06这样配合做才能解决这个问题。

中尉兄

  • 精华:0帖
  • 求助:0帖
  • 帖子:25帖 | 436回
  • 年度积分:0
  • 历史总积分:647
  • 注册:2006年6月05日
发表于:2006-07-27 13:12:00
14楼
对了,如火兄,有profibus的协议吗?题外话!呵呵

热门招聘
相关主题

官方公众号

智造工程师