仪器网(yiqi.com)欢迎您!

| 注册 登录
网站首页-资讯-专题- 微头条-话题-产品- 品牌库-搜索-供应商- 展会-招标-采购- 社区-知识-技术-资料库-方案-直播- 视频

问答社区

modbus rtu 如何读保持寄存器

linjj6566 2012-02-28 11:54:13 415  浏览
  •  

参与评论

全部评论(2条)

  • heshaxiang 2012-03-10 00:00:00
    如果有串口软件,用03码读取内部寄存器就可以了。

    赞(14)

    回复(0)

    评论

  • wowhyfwow 2012-02-29 00:00:00
    /******************头文件定义******************/ #include <stdio.h> #include <string.h> #include <malloc.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termio.h> #define max_buffer_size 100 /*定义缓冲区Z大宽度*/ /*******************************************/ int fd; /*定义设备文件描述符*/ int flag_close; static unsigned char table_crc_hi[] = { 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40 }; static unsigned char table_crc_lo[] = { 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3, 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26, 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5, 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C, 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C, 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80, 0x40 }; int open_serial(int k) { if(k==0) /*串口选择*/ { fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY); /*读写方式打开串口*/ perror("open /dev/ttyS0"); } else { fd = open("/dev/ttyS1",O_RDWR|O_NOCTTY); perror("open /dev/ttyS1"); } if(fd == -1) /*打开失败*/ return -1; else return 0; } static unsigned short int crc(unsigned char *buffer, unsigned short int buffer_length)//计算CRC校验码 { unsigned char crc_hi = 0xFF; /* high CRC byte initialized */ unsigned char crc_lo = 0xFF; /* low CRC byte initialized */ unsigned int i; /* will index into CRC lookup */ /* pass through message buffer */ while (buffer_length--) { i = crc_hi ^ *buffer++; /* calculate the CRC */ crc_hi = crc_lo ^ table_crc_hi[i]; crc_lo = table_crc_lo[i]; } return (crc_hi << 8 | crc_lo); } int main(int argc, char *argv[ ] ) { unsigned char sbuf[20];/*待发送的内容,以\n 为结束标志*/ sbuf[0] = 0x01; //Device id sbuf[1] = 0x06; //功能码 读保持寄存器是06(多个) sbuf[2] = 0x00; sbuf[3] = 0x6B; //start address(2 bytes) sbuf[4] = 0x00; sbuf[5] = 0x03; //the number of registers(2 bytes) unsigned short int temp; //calculate the CRC unsigned char crc_hi; unsigned char crc_lo; temp = crc(sbuf,6); crc_hi = temp >> 8; crc_lo = temp & 0x00FF; sbuf[6] = crc_hi; sbuf[7] = crc_lo; int sfd,retv,i; struct termios option; int length=8;/*发送缓冲区数据宽度*/ open_serial(0); /*打开串口1*/ printf("ready for sending data...\n"); /*准备开始发送数据*/ tcgetattr(fd,&option); cfmakeraw(&option); cfsetispeed(&option,B9600); /*波特率设置为9600bps*/ cfsetospeed(&option,B9600); tcsetattr(fd,TCSANOW,&option); for(i=0;i<length;i++) { printf("[%0x]",sbuf[i]); } printf("\n"); retv=write(fd,sbuf,length); /*send数据*/ if(retv==-1) { perror("write"); } printf("the number of char sent is %d\n",retv); ioctl(fd,TCFLSH,0); unsigned char rbuf[max_buffer_size]; /*定义接收缓冲区*/ int flag_close, retv1,j,ncount=0; printf("ready for receiving data...\n"); retv1=read(fd,rbuf,20); /*接收数据*/ if(retv1==-1) { perror("read"); /*读状态标志判断*/ } printf("The data received is:\n"); /*输出接收到的数据*/ for(j=0;j<retv1;j++) { printf("[%0x]",rbuf[j]); } printf("\n"); flag_close =close(fd); if(flag_close ==-1) /*判断是否成功关闭文件*/ printf("Close the Device failur!\n"); return 0; } 你自己看着改吧,我也刚学。

    赞(9)

    回复(0)

    评论

获取验证码
我已经阅读并接受《仪器网服务协议》

热门问答

modbus rtu 如何读保持寄存器
 
2012-05-20 15:47:23 309 1
modbus rtu 如何读保持寄存器
 
2012-02-28 11:54:13 415 2
modbus RTU 寄存器地址怎么设置?
 
2015-07-22 01:03:05 466 1
如何扫描modbus rtu通讯的设备的某个寄存器地址。
我手上有一个温度控制器,modbus通讯协议的。同时我给这个温度控制器加装了一个直流输入模块(可以测量输入的直流信号)。现在我想知道这个温度控制器的温度信号寄存器地址(实时显示当前测量到的温度)和直流模块信号的寄存器地址(实时显示当前测量到的直流... 我手上有一个温度控制器,modbus通讯协议的。同时我给这个温度控制器加装了一个直流输入模块(可以测量输入的直流信号)。现在我想知道这个温度控制器的温度信号寄存器地址(实时显示当前测量到的温度)和直流模块信号的寄存器地址(实时显示当前测量到的直流电压大小所对应的一个值),我该怎么做。希望大神解答。 展开
2016-11-24 09:28:50 569 1
modbus rtu 一个寄存器返回四个字节还是标准的modbus吗
2015-05-07 18:15:16 312 2
javascript 如何发送modbus rtu 指令
有一个继电器,通过485转usb接在电脑上(客户机),客户机通过浏览器访问服务端,要根据服务端返回的不同数据给继电器发送不同的指令!现在的初步想法是从服务端返回一个json数据,根据json数据用javascript给继电器发送指令,但不知道如何实现!
2015-06-01 10:07:47 351 2
modbus rtu协议
仪表的modbus rtu 协议的保持寄存器地址是从40001,但是OPC软件上的modbus rtu 协议却是400001开始,我不知道怎么获取仪表上的数据,我软件上我要怎么跟仪表地址对起来。
2011-12-24 07:10:01 519 4
modbus rtu是什么?
 
2012-10-13 03:39:38 397 2
GPRS RTU模块可以将modbus TCP转换成modbus RTU吗?或是将modbus RTU转换成modbus TCP?
 
2014-12-21 15:17:31 270 1
Modbus RTU协议开关量打包在寄存器,读取时候排序是怎么样的?
Modbus RTU协议开关量打包在寄存器,读取时候排序是怎么样的? 收到寄存器数据比如是 HEX :36A8 二进制是 : ‭0011011010101000‬ , 还原的顺序是 16-1,还是1-16,还有的说是 8-1,16-9; 到底哪个是标准的, 希望有高手帮解答! 谢谢
2018-05-04 16:35:11 430 2
modbus rtu通讯协议 如何判断超时
 
2010-08-08 03:08:06 518 3
tcp网络如何发送modbus rtu命令
 
2018-11-22 02:01:13 242 0
如何 把can bus 转为modbus rtu
 
2017-06-10 09:58:11 314 1
C语言如何编写modbus RTU协议?
我用c语言编写程序,通过USART收发数据,硬件电路为RS-485,我想实现modbus RTU协议的通信,如何配置和编写?越详细越好,多谢,若有资料提供,发到2041479809@qq.com邮箱,感激不尽!
2017-01-08 15:58:41 521 1
Modbus RTU 帧接收完毕如何判断
Modbus RTU 判断一帧数据接收完成,是不是就用定时器判断接收到的两字符时间间隔是否大于传送3.5个字符时间呀?但这样的话,接收完一帧数据还必须要花费大概1.45个毫秒(对波特率19200,28/19200)来判断接收完毕了,才能去处理接收到的数据,会不会影响下一帧... Modbus RTU 判断一帧数据接收完成,是不是就用定时器判断接收到的两字符时间间隔是否大于传送3.5个字符时间呀?但这样的话,接收完一帧数据还必须要花费大概1.45个毫秒(对波特率19200,28/19200)来判断接收完毕了,才能去处理接收到的数据,会不会影响下一帧数据的接收呀?一般发送两帧数据之间的时间间隔是多少呀?有没有其他的判断帧接收完毕的方法呀?谢谢 展开
2012-05-07 03:16:16 464 3
modbus RTU通讯协议通讯的时候可以同时对两个寄存器进行读取吗?
拿到的通讯协议里,比如某个变量L寄存器的地址是0x3002,H寄存器的地址是0x3003,那么可以同时读取这两个地址的值吗?如果可以,数据帧该怎么表达呢?
2017-05-19 08:48:38 685 1
modbus rtu串口通信
公司买了一个温度巡检仪,功能有限,我想通过自己做的软件来增强巡检仪的功能,但对串口通信编程知之甚少。现通过监控原程序得到以下数据:write requests: 01 03 00 01 00 01 D5 CA 01 01 00 50 00 20 3D C3 01 03 00 60 00 10 44 18 read requests: 01 03... 公司买了一个温度巡检仪,功能有限,我想通过自己做的软件来增强巡检仪的功能,但对串口通信编程知之甚少。现通过监控原程序得到以下数据:write requests: 01 03 00 01 00 01 D5 CA 01 01 00 50 00 20 3D C3 01 03 00 60 00 10 44 18 read requests: 01 03 02 00 02 39 85 01 01 04 00 00 00 00 FB D1 01 03 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 4E 20 AE 38 从中能不能翻译出什么东西?? 后来我又根据已有资料及网上相关程序编写了以下通讯程序: Private Sub Command1_Click() '发请求 Dim btSend(23) As Byte btSend(0) = &H1 '目标站号 btSend(1) = &H3 '功能码 btSend(2) = &H0 'I0.0地址(0000)高字节 btSend(3) = &H1 'i0.0地址(0000)低字节 btSend(4) = &H0 '读取个数高字节 btSend(5) = &H1 '读取个数低字节 btSend(6) = &HD5 btSend(7) = &HCA btSend(8) = &H1 btSend(9) = &H1 btSend(10) = &H0 btSend(11) = &H50 btSend(12) = &H0 btSend(13) = &H20 btSend(14) = &H3D btSend(15) = &HC3 btSend(16) = &H1 btSend(17) = &H3 btSend(18) = &H0 btSend(19) = &H60 btSend(20) = &H0 btSend(21) = &H10 btSend(22) = &H44 btSend(23) = &H18 ComK3.Output = CVar(btSend) Dim btReceive As Variant With ComK3 Do DoEvents Loop Until .InBufferCount = 5 .InputLen = 30 btReceive = .Input Text1.Text = Hex$(btReceive(1)) Text2.Text = Hex$(btReceive(2)) Text3.Text = Hex$(btReceive(3)) Text4.Text = Hex$(btReceive(4)) ' Text5.Text = Hex$(btReceive(5)) 'Text6.Text = Hex$(btReceive(6)) ' Text7.Text = Hex$(btReceive(7)) ' Text8.Text = Hex$(btReceive(8)) ' Text9.Text = Hex$(btReceive(9)) ' Text10.Text = Hex$(btReceive(10)) ' Text11.Text = Hex$(btReceive(11)) ' Text12.Text = Hex$(btReceive(12)) ' Text13.Text = Hex$(btReceive(13)) ' Text14.Text = Hex$(btReceive(14)) ' Text15.Text = Hex$(btReceive(15)) ' Text16.Text = Hex$(btReceive(16)) ' End If End With End Sub Private Sub Form_Load() With ComK3 .CommPort = 1 .Settings = "9600,N,8,2" .InputMode = comInputModeBinary '二进制收发 .InBufferSize = 512 .OutBufferSize = 512 If (Not .PortOpen) Then .PortOpen = True End With End Sub 能收到4个乱码,应该是错误标示,原程序待CRC验证,我验证不出,所以先删除了。期望大侠们帮我修改下程序 展开
2009-07-05 16:19:26 358 2
人机 MODBUS Rtu通讯
人机为主站是怎样从人机改变MODBUS地址的数据 人机为从站 怎样发送页面指令给主站以告知主站要显示的地址数据
2012-12-23 07:13:58 360 1
modbus rtu怎么样调试
 
2017-03-07 09:02:52 411 1
Modbus RTU通讯问题
物理连接结构:主设备ADAM5510,通讯端口【ADAM5090 (RS232)】 连接【RS232/RS485转换】并联从设备1、2。标准Modbus RTU协议。主设备发指令读取从设备寄存器地址。只有1有响应,2无响应,断开1则2有响应 用电脑替换主设备,分别发指令至1、2均有正确回应。何... 物理连接结构:主设备ADAM5510,通讯端口【ADAM5090 (RS232)】 连接【RS232/RS485转换】并联从设备1、2。标准Modbus RTU协议。主设备发指令读取从设备寄存器地址。只有1有响应,2无响应,断开1则2有响应 用电脑替换主设备,分别发指令至1、2均有正确回应。何解??? 如何实现主设备正常与多个从设备通讯? 展开
2011-09-05 09:04:46 425 2

9月突出贡献榜

推荐主页

最新话题