电表 485 通信调试
要针对电表的通讯协议而定,你找电表的通讯协议,按照协议规定的格式发送请求报文。如果连接方式没问题、通讯设置正确、报文正确,就可以收到正确的应答。刚好前几天我连过一个电表,它用的是DLT-645协议,在这个协议中你要注意+30和-30的处理。

“485通信协议”是什么?
RS485是物理层不是通讯协议,以RS485为物理层的通讯协议有很多,例如:MODBUS,西门子的PROFIBUS DP , PA, MPI ,PPI ,等等。RS485是物理层,不是通讯协议,以RS485为物理层的通讯协议有很多,例如:MODBUS,西门子的PROFIBUS DP , PA, MPI ,PPI 等等。1、物理层(或称物理层,Physical Layer)是计算机网络OSI模型中最低的一层。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,物理层确保原始的数据可在各种物理媒体上传输。局域网与广域网皆属第1、2层。2、物理层是OSI的第一层,它虽然处于最底层,却是整个开放系统的基础。物理层为设备之间的数据通信提供传输媒体及互连设备,为数据传输提供可靠的环境。如果您想要用尽量少的词来记住这个第一层,那就是“信号和介质”。OSI采纳了各种现成的协议,其中有RS-232、RS-449、X.21、V.35、ISDN、以及FDDI、IEEE802.3、IEEE802.4、和IEEE802.5的物理层协议。
RS485是通讯接口,可以用很多种协议在这个接口下走通讯。通常用的协议而言,MODBUS协议较为普遍。但就485接口而言,现在已经不是最方便 的 了,你可以试试二总线接口方案。

485通讯格式
参考以下: 1)485是接口方式 2)它支持Modbus RTU和Modbus ASCII协议,具体看从站支持协议

数显电流表的RS485通讯规约是什么东西
数显仪表的通讯一般有RS232,RS485来通讯,简单来讲就是将仪表测量的数据通过通讯的方式上传到上位机显示出来。 B600-AC1-1A1的RS485通讯规约是标准的moudbus通讯规约。传输方式:异步串行通信方式。采用规约:MODBUS从站规约。传输速率:2400 bps,4800bps,9600bps,19200bps,38400bps。传输电缆: 采用带屏蔽的多芯铜导线,接口标准应采用一对双绞线。组成RS-485网络时,双绞线电缆特性阻抗约120Ω,导线电阻应小于0.10Ω/m,导线间电容应小于60pF/m,导线与屏蔽层间电容小于100pF/m 。通信接口:RS-485接口为后面板2个端子。传输距离:1300米。主站数目:1个。从站数目:最多31个。应答时间:大于4个字符时间以下是 MODBUS协议基本规则1. 1 MODBUS协议基本规则以下规则确定在RS485回路控制器和其他RS485串行通信回路中设备的通信规则:1) 所有RS485回路通信应遵照主/从方式。在这种方式下,信息和数据在单个主站和最多99个从站(监控设备)之间传递;2) 主站将初始化和控制所有在RS485通信回路上传递的信息;3) 无论如何都不能从一个从站开始通信;4) 所有RS485环路上的通信都以“打包”方式发生。一个报文就是一个简单的字符串(每个字符串8位),一个报文中最多可含255个字节。组成这个报文的字节构成标准异步串行数据,并按1位起始位,8位数据位,1位校验位,1位停止位的方式传递。5) 主站发送报文称为请求,从站发送报文称为响应;6) 任何情况从站只能响应主站一个请求。1. 2传送模式MODBUS协议可以采用ASCII或者RTU模式传送数据。B600-AC系列智能表仅仅支持RTU模式:1位起始位,8位数据位,1位校验位,1位停止位。1. 3 MODBUS报文结构:每个MODBUS报文都由以下四个部分组成:地址域、功能码域、数据域和校验域。1.3.1 地址域MODBUS的从站地址域长度为一个字节。有效的从站地址范围从1~99。从站如果接收到一帧从站地址域信息与自身地址相符合的报文时,从站执行报文中所包含的命令。从站所响应的报文中地址域为自身地址。1.3.2 功能码域MODBUS报文中功能域长度为一个字节,用以通知从站应当执行何操作。从站响应报文中包含主站所请求操作的相同功能域字节。有关智能表的功能码参照下表。功能码含义功能03读取寄存器读取仪表内部一个或多个当前寄存器值06写一个或多个寄存器将指定数值写入仪表内部一个或多个寄存器内05写一个继电器输出状态将指定继电器输出节点断开或闭合1.3.3 数据域MODBUS数据域采用“BIG INDIAN”模式,即是高位字节在前,低位字节在后。举例如下:1个16位寄存器包含数值为0x1234,寄存器数值发送顺序为:高位字节 = 0x12,低位字节 = 0x341.3.4 校验域MODBUS-RTU模式采用16位CRC校验。发送设备应当对报文中的每一个数据都进行CRC-16计算,最后结果存放入检验域中。接收设备也应当对报文中的每一个数据(除校验域以外)进行CRC-16计算,将结果域校验域进行比较。只有相同的报文才可以被接受。具体的CRC校验算法参照第三章。1. 4网络时间考虑在RS485网络上传送报文需要遵循以下有关时间的规定:1)主站请求报文结束到从站响应报文开始之间的时间最小为10毫秒。2)从站响应报文结束到主站下一请求报文开始之间的时间应大于1000毫秒。3) 通信超时的处理。1. 5异常响应异常报文的处理方式:不予理睬,以适应多机组网通信方式。 还有通讯报文,写寄存器等。这个你可以查看实物来学习下。
RS-485是一种串行通信总线。在要求通信距离为几十米到上千米时,广泛采用RS-485 串行总线标准。每种不同的仪表,厂家会规定不同的通讯规约,按照规约,可以解释仪表输出的数据以及控制仪表工作。通讯规约,简单来说,就是一种数据排列的格式。 智能仪表最初是数据模拟信号输出简单过程量,后来仪表接口是RS232接口,这种接口可以实现点对点的通信方式,但这种方式不能实现联网功能。随后出现的RS485解决了这个问题。1. RS-485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为-(2~6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL电路连接。2. RS-485的数据最高传输速率为10Mbps。3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干扰能力增强,即抗噪声干扰性好。 4. RS-485最大的通信距离约为1219m,最大传输速率为10Mbps,传输速率与传输距离成反比,在100Kb/S的传输速率下,才可以达到最大的通信距离,如果需传输更长的距离,需要加485中继器。RS-485总线一般最大支持32个节点,如果使用特制的485芯片,可以达到128个或者256个节点,最大的可以支持到400个节点。

485通信协议怎么规定
把通讯做成命令,应答的帧形式,最好是帧长度固定。 举个例子,主机发送给从机的数据帧头 命令 参数1 参数2 参数3 参数4 校验和 帧尾从机回复的数据回复帧头 应答命令 结果1 结果2 结果3 结果4 校验和 回复帧尾在从机接收到帧头和命令后,并不进行处理,而是暂存起来,知道接收到帧尾,并接校验通过后,才真正执行。假如从收到帧头起,一定的时间内,还没有收到完整的帧,或者帧校验失败,那么从机用特殊的格式回复。当然,超时时间也可以不从帧头算,从上一个字节算也可以。这样的帧结构就能保证通讯的正确性,一般来讲,帧越长,通讯效率越高,但是占用暂存空间越打,而且出错的可能越大,出错后付出的代价也越大,实时性也越差,而且帧长度超过一定值后,通讯效率也不会再明显增加。帧越短,通讯效率越低,但是灵活。像上面的例子,帧长度是8,通讯效率是62.5%。如果将帧长度改为16,通讯效率变为81.25%下面是源代码:直接拷贝就能够编译通过了。当然要把寄存器改了。只有几行需要改的哈:#include "tot.h"#define GOOD_PARSE 0#define BADID_PARSE1#define BADLEN_PARSE 2short parsed;char *pbuf;void tsip_input_proc(TSIPPKT *rpt,unsigned char inbyte);void rpt_packet(TSIPPKT *rpt,int *obuf);void tsip_input_proc(TSIPPKT *rpt,unsigned char inbyte){switch(rpt->status){case TSIP_PARSED_DLE_1:switch(inbyte){case 0:case ETX: // illegaldatarpt->len=0;rpt->status=TSIP_PARSED_EMPTY;break;case DLE: // try normal message start againrpt->len=0;rpt->status=TSIP_PARSED_DLE_1;break;default: // legal ID ;start messagerpt->len=0;rpt->status=TSIP_PARSED_DATA;rpt->codes=inbyte;break;}break;case TSIP_PARSED_DATA:switch(inbyte){case DLE: // expect DLE or ETX nextrpt->status=TSIP_PARSED_DLE_2;break;default: // normal data byterpt->buf[rpt->len]=inbyte;rpt->len++;break;}break;case TSIP_PARSED_DLE_2:switch(inbyte){case DLE: // normal data byterpt->buf[rpt->len]=inbyte;rpt->len++;rpt->status=TSIP_PARSED_DATA;break;case ETX: // end of message,return TURE hererpt->status=TSIP_PARSED_FULL;break;default: // error:treat as TSIP_PARSED_DLE_1,start new report packetrpt->codes=inbyte;rpt->len=0;rpt->status=TSIP_PARSED_DATA;break;}break;caseTSIP_PARSED_FULL:caseTSIP_PARSED_EMPTY:default:switch(inbyte){case DLE: // normal message startrpt->len=0;rpt->status=TSIP_PARSED_DLE_1;break;default: // error:ignore inbyterpt->len=0;rpt->status=TSIP_PARSED_EMPTY;break;}break;}if(rpt->len>MAX_RPTBUF) // error:start new report packet{rpt->status=TSIP_PARSED_EMPTY;rpt->len=0;}}//串口字符交换*******************************************************************/int bGetShort(char *bp){int outval;char *optr;optr=(char *)&outval*optr=*bp<<8 & 0xFF00;*optr=*(++bp) | *optr;return outval;}//串口报文int rpt_0x14(TSIPPKT *rpt,int output[1]){char *buf;buf=rpt->buf;if(rpt->len!=2)return 0;output[0]=bGetShort(&buf[0]);return 1;}void rpt_packet(TSIPPKT *rpt,int *obuf){parsed=GOOD_PARSE;switch(rpt->codes){case 20:rpt_0x14(rpt,obuf);break;default:parsed=BADID_PARSE;break;}}//发送void send_cmd(TSIPPKT *cmd, void sendb(char)){char *cbuf, *cbufend;sendb (DLE);sendb (cmd->codes);cbufend = cmd->buf + cmd->len;for (cbuf = cmd->buf; cbuf < cbufend; cbuf++) {if (*cbuf == DLE) sendb (DLE);sendb (*cbuf);}sendb (DLE);sendb (ETX);}void sendb(char outbyte){//ScibRegs.SCITXBUF=outbyte;}//字符交换void bPutShort(unsigned int *in, char *out){char *inptr;inptr=(char *)in;*out= (*inptr>>8) & 0x00FF;*(++out) = *inptr & 0x00FF;}//命令void cmd_0x0(TSIPPKT *cmd,SCICALOUT *out){bPutShort(&(out->ve),&(cmd->buf[0]));cmd->len = 2;cmd->codes =37;}//串口使用中断方式接收,发送不采用中断int input[MAX_RPTBUF];void SCIRXD_ISR(void){tsip_input_proc(&rpt,ScibRegs.SCIRXBUF.bit.RXDT);// analyseif (rpt.status == TSIP_PARSED_FULL) // receive complete{rpt_packet(&rpt,input); // output reportsrpt.status=TSIP_PARSED_EMPTY;// prepare for next}ScibRegs.SCIFFRX.bit.RXFFOVRCLR=1;// Clear Overflow flagScibRegs.SCIFFRX.bit.RXFFINTCLR=1;// Clear Interrupt flagPieCtrlRegs.PIEACK.all|= PIEACK_GROUP9; // Issue PIE ack}//发送调用方式//cmd_100x0(&cmd);//send_cmd(&cmd,&sendb);//发送调用方式//cmd_100x0(&cmd);//send_cmd(&cmd,&sendb); 上面的就是源代码。。记住把寄存器改了哦。无论是单片机还是上位机都可以用这个哈。
485则是教室里面一个老师和很多个学生交谈,当老师(主控设备)点名(即轮询到某个485地址码)要求某个学生(从设备)回答问题,这个学生如果没有翘课(从设备故障或者通信故障)的话,就应答站起来回答问题。在老师点名,学生答问的过程中,都是只有一个人发言,因为485总线有这样的仲裁机制,所以才可以实现点到多点的通信 你在协议里面实现这个功能就可以了,编程是基于串口编程,VB直接调用串口控件的。
请看 百度百科 串口通讯http://baike.baidu.com/view/542656.htmrs232http://baike.baidu.com/view/196461.htmrs485http://baike.baidu.com/view/542681.htm

本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/70873.html。