modbus方面我得 有如下问题:receBuf[1]是功能码,为什么这里功能码是1 3 5,不作处理,而在功能码为6的分支里边处理? 点击:987 | 回复:2



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2005-04-22 21:41:00
楼主
modbus方面我得 有如下问题:receBuf[1]是功能码,为什么这里功能码是1 3 5,不作处理,而在功能码为6的分支里边处理? 1。这有什么区别? 15 强置多线圈 强置一串连续逻辑线圈的通断   16 预置多寄存器 把具体的二进制值装入一串连续的保持寄存器 2。我看:微控电子 www.mcuc.cn modbus RTU 的C51程序 receBuf[1]是功能码,为什么这里功能码是1 3 5,不作处理,而在功能码为6的分支里边处理? switch(receBuf[1]) { case 1://读取线圈状态(读取点 16位以内) case 3://读取保持寄存器(一个或多个) case 5://强制单个线圈 case 6://设置单个寄存器 if(receCount >= 8) {//接收完成一组数据 //应该关闭接收中断 if(receBuf[0]==localAddr && checkoutError==0) { crcData = crc16(receBuf,6); if(crcData == receBuf[7]+(receBuf[6]<<8)) {//校验正确 if(receBuf[1] == 1) {//读取线圈状态(读取点 16位以内) readCoil(); } else if(receBuf[1] == 3) {//读取保持寄存器(一个或多个) readRegisters(); } else if(receBuf[1] == 5) {//强制单个线圈 forceSingleCoil(); } else if(receBuf[1] == 6) { //presetSingleRegister(); } } } receCount = 0; checkoutError = 0; } break; case 15://设置多个线圈



天下草民

  • 精华:0帖
  • 求助:0帖
  • 帖子:107帖 | 1044回
  • 年度积分:0
  • 历史总积分:1477
  • 注册:2003年10月28日
发表于:2005-04-23 14:07:00
1楼
程序表明1356同时处理了。

budong

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 12回
  • 年度积分:0
  • 历史总积分:69
  • 注册:2004年9月02日
发表于:2005-04-26 13:47:00
2楼
简直太简单了 先判断功能码,1读线圈,3读寄存器 6是写单个寄存器 1,3,5,6 都应该接收8个字节 例如 01 03 00 10 00 04 再加两个CRC校验码。 CASE 1: CASE 3: CASE 5: CASE 6: 功能码是这几种情况,判断接受的字节是否够8个,然后判断地址时不是自己的,然后CRC校验,然后根据不同的功能码处理。 实际上,15 16就相当于PLC中的位元件和字元件的区别

热门招聘
相关主题

官方公众号

智造工程师