当前位置:文档之家› 组态王及modbus通信课程设计

组态王及modbus通信课程设计

组态王及modbus通信课程设计
组态王及modbus通信课程设计

测控网络课程设计

一、实践要求

本次实践以开发DCS测控系统为最终目的,要求掌握DCS测控系统的工作原理,学习组态王工控组态软件的使用方法,根据要求完成工程组态;掌握MODBUS通信协议的原理,开发具有MODBUS通讯功能的智能仪表,最终完成和组态工程之间的通讯。

二、实践内容

分为两大部分:1、组态王基本操作2、MODBUS通讯

具体内容:

(1)熟悉组态王软件安装,基本开发环境,采用构建简单的工程(采用仿真数据和设备,工程应包含PID功能),计划时间1天;

(2)根据罐区工艺的要求,完成相应的组态工程,实现对原油储罐的监控,计划时间2天;

(3)掌握MODBUS通讯协议的工作原理,在MSP430F5438单片机上编程实现MODBUS客户端服务程序,要求通过串行口将现场的温度、泵状态、流量等参数上传到上位机上,计划时间3天。

(4)在单片机上编程实现流量、温度上下限及仪表地址和波特率等参数设置功能,同时能从上位机对仪表参数进行设置,计划时间2天。

(5)优化设计,要求当出现通讯错误时在上位机和单片机上都要做出相应的反应,计划时间0.5天。

(6)①上位机采用高级语言编程,实现对现场智能仪表的控制。

②熟悉现场总线测控网络系统,搭建PROFIBUS网络,实现对ET200S和S7-200的控制。

组态王部分

一、设计要求

根据罐区工艺的要求,完成相应的组态工程,实现对原油储罐的监控。

1、罐区工艺流程图

2- 储油罐进口电动阀;3- 储油罐排污电动阀;4- 储油罐出口电动阀;5- 泵

图1:罐区工艺流程图

2、具体要求

(1)监测各罐的液位(0-20m)/ (0-1m)/温度(0-100度)(现场仪表4-20mA输出)。

(2)根据各罐液位控制各罐出口电动阀(H>16m, 关进口阀,选择最低液位的罐进油;

H<2m,关出口阀,选择最高液位的罐出油),手动遥控排污阀。

液位H>15.5m高报警, H>17m高高报警;

液位H<2m低报警, H<1.5m低低报警。

界位>1m高报警, 界位>1.5m高高报警;

界位<0.5m低报警, H<0.2m低低报警;

(3)启动泵组设置出入口流量(100M3/h,200M3/h,250M3/h)

二、设计内容

(一)组态数据库:数据库-----数据词典

(二)组态画面

画面1:工艺流程总画面

对画面的基本说明:

主要功能:对油罐液位的监测。

泵总开关控制进口的3个泵的总开和总关;

泵总关闭控制出口的3个泵的总关和总开;

当同时按下泵提示和某一个泵的按钮,显示该泵的详细信息;

液位报警和界位报警时记录相应的报警事件;

液位实时和历史曲线记录油罐液位的变化情况。

画面2:各泵弹出式放大画面(包括参状态/型号等),点击总画面上的泵弹出此画面1、编写事件命令语言:当同时按下泵提示和某一个泵的按钮,显示该泵的参数信息。

2、弹出画面

画面3:液位/界位报警画面

报警设置:

低低、低、高、高高报警值设置:

液位报警画面:

画面4:液位/温度/界位各一个实时趋势图和历史趋势图

实时趋势图:选择工具箱中的工具,在画面上绘制一实时趋势曲线窗口。在曲线定义选项卡中选择要实时反映的变量。

历史趋势图:对于要以历史趋势曲线形式显示的变量,必须设置变量的记录属性。在“定义变量”对话框中单击“记录和安全区”属性页,将不记录改为数据变化记录,变化灵敏为:0。在工程浏览器窗口左侧的“工程目录显示区”中双击“系统配置”中的“历史数据记录”

选项,弹出“历史记录配置”对话框。

实时和历史趋势图:

画面4:报表画面(液位,温度,界位)

报表分为实时数据报表和历史数据报表。

(3)优化设置

1、组态操作权限

优先级分1~999 级,1 级最低999 级最高。每个操作者的优先级别只有一个。系统安全区共有64 个,用户在进行配置时。每个用户可选择除“无”以外的多个安全区,即一个用户可有多个安全区权限。

设置油罐用户组,将管理员、操作员看成用户,并设置管理员优先级最高,并设置相应的密

码。配置运行现象登陆界面

2、通过链接切换画面

增加报警画面、趋势图、报表画面,通过右侧链接

(4)画面命令语言

变量说明:g1、g2、g3、g4代表每个油罐的液位,in代表泵总开,out代表泵总关,in1、in2、in3、in4代表每个油罐的入口阀门,out1、out2、out3、out4代表每个油罐的出口阀门,clear1、clear2、clear3、clear4代表手动排污阀。bengin1,2,3和bengout1,2,3代表进口泵和出口泵。

num代表泵输入总流量的比

num=bengin1*1 + bengin2*2 + bengin3*2.5; num1代表泵输出总流量的比

num1=bengout1*1 + bengout2*2 + bengout3*2.5;

设置每个油罐跟液位相关的系数值

xishu1=0.25;

xishu2=0.2;

xishu3=0.15;

xishu4=0.3;

if(in==1 && num>0)

{

如果油罐1液位最低,增加油罐1的液位if(g1<=g2 && g1<=g3 && g1<=g4 && g1<16)

{

in1=1;

in2=0;

in3=0;

in4=0;

g1=g1+num*xishu1;

}

else

{

如果油罐2液位最低,增加油罐2的液位if(g2

{

in1=0;

in2=1;

in3=0;

in4=0;

g2=g2+xishu2*num;

}

else

{

如果油罐3液位最低,增加油罐3的液位if(g3

in1=0;

in2=0;

in3=1;

in4=0;

g3=g3+xishu3*num;

}

else

{

如果油罐4液位最低,增加油罐4的液位if(g4

in1=0;

in2=0;

in3=0;

in4=1;

g4=g4+xishu4*num;

}

}

}

}

}

if(out==1 && num1>0)

{

如果油罐1液位最高,降低油罐1的液位if(g1>=g2 && g1>=g3 && g1>=g4 && g1>2)

{

out1=1;

out2=0;

out3=0;

out4=0;

g1=g1-xishu1*num1;

}

else

{

如果油罐2液位最高,降低油罐2的液位if(g2>=g1 && g2>=g3 && g2>=g4 && g2>2)

{

out1=0;

out2=1;

out3=0;

out4=0;

g2=g2-xishu2*num1;

}

else

{

如果油罐3液位最高,降低油罐3的液位if(g3>=g1 && g3>=g2 && g3>=g4 && g3>2)

{

out1=0;

out2=0;

out3=1;

out4=0;

g3=g3-xishu3*num1;

}

else

{

如果油罐4液位最高,降低油罐4的液位if(g4>=g1 && g4>=g2 && g4>=g3 && g4>2)

{

out1=0;

out2=0;

out3=0;

out4=1;

g4=g4-xishu4*num1;

}

}

}}}

if(clear1==1 || clear2==1 || clear3==1 || clear4==1)

手动排污{

g1=g1-clear1*0.1;

g2=g2-clear2*0.1;

g3=g3-clear3*0.1;

g4=g4-clear4*0.1;

//jiewei1=jiewei1-0.1*clear1;

//jiewei2=jiewei2-0.1*clear2;

//jiewei3=jiewei3-0.1*clear3;

//jiewei4=jiewei4-0.1*clear4;

}

如果液位大于16,关闭相应的进口阀if(g1>=16)

{in1=0;}

if(g2>=16)

{in2=0;}

if(g3>=16)

{in3=0;}

if(g4>=16)

{in4=0;}

如果液位小于2,关闭相应出口阀

if(g1<=2)

{out1=0;}

if(g2<=2)

{out2=0;}

if(g3<=2)

{out3=0;}

if(g4<=2)

{out4=0;}

if(num==0)

{

in1=0;

in2=0;

in3=0;

in4=0;

}

if(num1==0)

{

out1=0;

out2=0;

out3=0;

out4=0;

}

(5)运行总画面

(6)与PLC通信设置

在工程浏览器中选择设备—com1—新建,如下图,配置com口跟PLC连接。

设置bengin1,2,3和bengout1,2,3分别与Q0.0等相联系,可观察到PLC输出指示灯会随着这

些变量的改变和改变。

三、组态王部分总结

组态王是组态王软件是一种通用的工业监控软件,它融过程控制设计、现场操作以及工厂资源管理于一体,将一个企业内部的各种生产系统和应用以及信息交流汇集在一起,实现最优化管理,操作方便,界面美观。组态王软件结构由工程管理器、工程浏览器及运行系统三部分构成。通过这次课程设计,我们学会了如何建立一个组态王工程,如何设计界面,编写命令语言、以及报警事件、趋势曲线和报表的相关制作,权限的设置,以及与实际设备的简单通信,通过本次实习,我想在以后工作中,我们会更好的应用此例软件,完成工业监控。

智能仪表部分

一、MODBUS ASCII和MODBUS RTU通讯协议简介

Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。

两种串行传输模式:RTU 模式和 ASCII 模式。

RTU传输模式:

当设备使用RTU (Remote Terminal Unit) 模式在Modbus 串行链路通信,报文中每个8位字节含有两个4 位十六进制字符。这种模式的主要优点是较高的数据密度,在相同的波特率下比ASCII 模式有更高的吞吐率。每个报文必须以连续的字符流传送。

RTU 模式每个字节( 11 位 ) 的格式为 :

编码系统: 8位二进制,报文中每个8 位字节含有两个4 位十六进制字符(0–9, A–F。) Bits per Byte: 1 起始位,8 数据位,首先发送最低有效位,1 位作为奇偶校验,1停止位。

ASCII传输模式

当 Modbus 串行链路的设备被配置为使用ASCII (American Standard Code for Information Interchange) 模式通信时,报文中的每个 8 位子节以两个ASCII 字符发送。ASCII 模式每个字节( 10 位 ) 的格式为 :

编码系统: 十六进制,ASCII 字符 0-9,A-F。报文中每个ASCII 字符含有1 十六进制字符。Bits per Byte: 1 起始位,7 数据位,首先发送最低有效位,1 位奇偶校验,1 停止位。

03读保持寄存器

上位机发送数据格式:

“ : ” ADDRESS 03 ADDRH ADDRL NUMH NUML LRC 0X0D 0X0A

正确时变频器返回数据格式:

“ : “ ADDRESS 03 BYTECOUNT DATA1 DATA2 DATA3 DATAN LRC 0D 0A

06 写单个保持寄存器值

上位机发送数据格式:

“ : “ ADDRESS 06 ADDRH ADDRL DATAH DATAL LRC 0X0D 0X0A

正确时变频器返回数据格式:

“ : “ ADDRESS 06 ADDRH ADDRL DATAH DATAL LRC 0X0D 0X0A

二、MODBUS ASCII编程以及与组态王通信

1、变量定义

unsigned char ERR[21]= " Input LRC ERROR!"; //出错时显示字符

unsigned char RX[32]; //单片机接受数据数组

unsigned char TX[32]; //03功能时单片机发送数据数组

unsigned char TX6[32]; //06功能时单片机发送数据数组

unsigned char Buf[10]; //存储数据的数组

unsigned int flag; // 上位机发送数据标志位

unsigned int flag1; //单片机应答数据标志位

unsigned int flow; // 流量值

unsigned int temperature; //温度值

unsigned char LRC; //上位机发送数据校验码

unsigned char LRCt; //单片机应答数据校验码

2、通过UART中断完成上位机给单片机发送

编程思路:

通过UART中断,实现上位机给单片机发送数据,当单片机接受到:,表示上位机要向单片机发送指令,相应标志位置1,当再次发生中断时,就开始接受数据,同时存入RX[32]的数组里,直到接收到回车换行符,则发送命令结束。此时发送标志位置1,进入应答程序。#pragma vector=USCI_A1_VECTOR

__interrupt void USCI_A1_ISR(void)

{

while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕

if(UCA1RXBUF == ':') //:为起始标志,如果开始,标志位flag置位

{

flag = 1;

}

if(flag==1) //当标志位flag置位说明发送命令开始,开始接受命令数据

{

RX[0] = ':';

if(UCA1RXBUF != 0x0D && UCA1RXBUF != 0x0A ) //只要不是回车换行符,就依

次将数据存入接受数组RX中,同时计数变量tempnumb加1

{

tempnumb++;

RX[tempnumb] = UCA1RXBUF ;

}

if(UCA1RXBUF == 0x0D) //若是回车

{

tempnumb++;

RX[tempnumb] = 'D' ;

}

if(UCA1RXBUF == 0x0A) //若是换行

{

tempnumb++;

RX[tempnumb] = 'A' ;

flag=0; //接受标志位清零

flag1=1; //发送标志位置1

TTXX(); //调用发送数据函数

}

}

}

3、单片机通过UART中断向上位机发送应答指令

编程思路:

先计算上位机发送数据的校验码,如果和发送的校验码相同,单片机再应答。设置寄存器地址0001,存储流量数据;设置寄存器0002,存储温度数据。然后判断是03号功能还是06号功能,若是03号功能,按照相应的格式发送数据,若是06号功能,按照命令更改数据,并返回应答命令。

void TTXX()

{

int i;

int j;

unsigned int b;

unsigned int c;

unsigned int d;

In_LRC(); //计数上位机发送命令校验码

if(RX[8]=='1') //如果地址为寄存器0001,发送流量数据

shitohex(flow);

if(RX[8]=='2') //如果地址位寄存器0002,发送温度数据

shitohex(temperature);

if(RX[3]=='0' && RX[4]=='3') //如果是03号功能

{

if((LRCHi == RX[tempnumb-3]) &&(LRCLo == RX[tempnumb-2])) //如果上位机发送校验码正确

{

for(b=0;b<=4;b++)

{

TX[b] = RX[b];

}

temp = asciitohex(RX[tempnumb-4]); //计算单片机要发送数据的字节数

TX[5] = hextoascii(((temp*2)>>4)&0x0F);

TX[6] = hextoascii((temp*2)&0x0F);

for(i=0;i

{

TX[7+i] = hextoascii(Buf[i]); //要发送的数据

TX[8+i] = hextoascii(Buf[i+1]);

}

tempnumt = 7+i; //统计数据长度,用于计算校验码

Out_LRC(); //计算单片机发送数据校验码

TX[7+i] = LRCtHi;

TX[8+i] = LRCtLo;

TX[9+i] = 0x0D;

TX[10+i] = 0x0A;

for(j=0;j<=(10+i);j++) //单片机发送数据

{

while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕

UCA1TXBUF=TX[j];

}

}

else //如果校验码不正确,返回错误代码 Input LRC ERROR!只能通过串口调试看到 {

ERR[19]='8';

ERR[20]=TX[4];

for(d=0;d<=20;d++)

{

while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕

UCA1TXBUF=ERR[d] ;

}

}

}

else if(RX[3]=='0' && RX[4]=='6') //如果是06号功能

{

for(c=0;c<=tempnumb;c++)

{

TX6[c] = RX[c];

while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕

UCA1TXBUF=TX6[c];

}

selflow(TX6[10]); //设置流量值

seltemp(TX6[11]); //设置温度值

}

flag1=0; //单片机发送标志位清零

tempnumb=0; //上位机发送数据计算值清零

}

4、辅助模块部分

(1)、LRC校验模块

编程思路:

LRC 的计算, 对报文中的所有的连续8 位字节相加,忽略任何进位,然后求出其二进制补码。unsigned char *auchMsg; 指向含有用于生成LRC 的二进制数据报文缓冲区的指针, unsigned short usDataLen; 报文缓冲区的字节数.

unsigned char MODBUS_LRC(unsigned char *auchMsg, unsigned short usDataLen)

{

unsigned char uchLRC = 0 ; // LRC 初始化

while (usDataLen--) // 完成整个报文缓冲区

uchLRC += *auchMsg++ ; //缓冲区字节相加,无进位

return ((unsigned char)(-((char)uchLRC))) ; // 返回二进制补码

}

(2)发送和应答校验码计数程序

void In_LRC()

{

unsigned int a;

for(a=1;a<(tempnumb-3);a+=2)

{

tempRX[(a-1)/2] = (asciitohex(RX[a])<<4) | asciitohex(RX[a+1]);

}

LRC=MODBUS_LRC(&tempRX[0],(tempnumb-4)/2); //进行LRC效验计算

LRCHi = hextoascii((LRC>>4)&0x0F);

LRCLo = hextoascii(LRC&0x0F);

}

void Out_LRC()

{

unsigned int c;

for(c=1;c

{

tempTX[(c-1)/2] = (asciitohex(TX[c])<<4);

tempTX[(c-1)/2] = (asciitohex(TX[c])<<4) | asciitohex(TX[c+1]);

}

LRCt=MODBUS_LRC(&tempTX[0],(tempnumt-1)/2); //进行LRC效验计算

LRCtHi = hextoascii((LRCt>>4)&0x0F);

LRCtLo = hextoascii(LRCt&0x0F);

}

(3)进制之间转换程序

由于发送和读取的数据是字符,而寄存器中数据多按照十六进制存储,故需要各种进制间的相互转换。

//十六进制数转换为ASCII码

unsigned char hextoascii(unsigned char hex)

{

if(hex<=0x09)

return hex+0x30;

else

return hex+0x37;

}

//ASCII码转换为十六进制的数

unsigned char asciitohex(unsigned char ascii)

{

if(ascii<=0x39)

return ascii-0x30;

else

return ascii-0x37;

}

//十进制转十六进制,由于组态王通信时会自动将十六进制数转换位十进制数,因此需要在单片机内将十进制数转换位十六进制数,这样组态王读到的就是十进制的数据。unsigned char shitohex(unsigned int shi)

{

int i,b,d,c;

int a=0;

d=4;

char shiliu[10];

while (shi) //shi代表相应的十进制数

{

c=shi%16; //每次除以16取余求得相应的十六进制数

shi=shi/16;

shiliu[a] = c;

a++;

}

for(i=a;i<=4;i++) //得到的数据首位倒置,才是要求的十六进制数

{

shiliu[i]=0;

}

for(b=0;b<4;b++)

{

d--;

Buf[b]=shiliu[d];

}

return 0;

}

(4)波特率,流量、温度的设置

//选定流量

void selflow(unsigned char selflow)

{

switch(selflow)

{

case '0':flow=100; break;

case '1':flow=1799; break;

case '2':flow=5000; break;

default:flow=1799; break;

}

}

//选定温度

void seltemp(unsigned char seltemp)

{

switch(seltemp)

{

case '0':temperature=1;break;

case '1':temperature=20; break;

case '2':temperature=100; break;

default:temperature=20; break;

}

}

//设定波特率

void selbps(unsigned char selbps)

{

switch(selbps)

{

case '0': UCA1CTL1 |= UCSSEL_1; // 时钟源选择

UCA1BR0 = 0x1B; //1200 UCA1BR1 = 0x00;

UCA1MCTL = 04;

break;

case '1': UCA1CTL1 |= UCSSEL_1; // 时钟源选择

UCA1BR0 = 0x0D; //2400 UCA1BR1 = 0;

UCA1MCTL = 0X0A;

break;

case '2': UCA1CTL1 |= UCSSEL_1; // 时钟源选择

UCA1BR0 = 6; //4800

UCA1BR1 = 0;

UCA1MCTL = 0x0C;

UCA1CTL1 &= ~UCSWRST; // 使能串口功能

UCA1IE |= UCRXIE; // 使能接收中断

_BIS_SR(GIE);

break;

case '3': UCA1CTL1 |= UCSSEL_1; // 时钟源选择

UCA1BR0 = 3; //9600 UCA1BR1 = 0;

UCA1MCTL = 06;

UCA1CTL1 &= ~UCSWRST; // 使能串口功能

UCA1IE |= UCRXIE; // 使能接收中断

_BIS_SR(GIE);

break;

default:UCA1CTL1 |= UCSSEL_1; // 时钟源选择

UCA1BR0 = 3; // 32768hz/3=9600

UCA1BR1 = 0;

UCA1MCTL = 06;

break;

}

}

5、实验现象:测试IO设备界面

组态王画面:实现读写功能

三、MODBUS RTU编程以及与组态王通信

1、变量定义

int R_flag=1; // 延时3.5字符标志

int R_flag1=0;

int R_flag2=1;

unsigned char Crc_RX[32]; //存储上位机发送的字符的数组

unsigned char Crc_TX[32]; //存储单片机应答的字符的数组

unsigned int crcnumt; // 统计上位机发送字符数据长度

unsigned int crcnumr; //统计单片机应答数据长度

unsigned char CRCHi8; //上位机发送数据的校验码高位

unsigned char CRCLo8; //上位机发送数据的校验码低位

unsigned char CRCtHi8; //单片机发送数据的校验码高位

unsigned char CRCtLo8; //单片机应答数据的校验码低位

unsigned char Buf[10]; //测试数据

2、设计延时3.5字符控制发送和接受数据的开始和接受

while (1) //接收起始结束判断函数

{

if(R_flag1==1)

{

if(count_leg==300) //此时间远大于3.5个字符,确保通信的正确 {

RTU_T();

R_flag = 1;

count_leg=0;

R_flag1=0;

}

else

{

count_leg=count_leg+1;

}

}

3、通过UART中断完成上位机给单片机发送

编程思路:通过UART中断完成上位机给单片机发送,当延时大于3.5个字符,R_flag==1,依次将值存入 Crc_RX[]数组中,再判断,若延时大于3.5个字符,则发送结束,R_flag1=1。#pragma vector=USCI_A1_VECTOR

__interrupt void USCI_A1_ISR(void)

{

if(R_flag==1)

{

Crc_RX[crcnumr] = UCA1RXBUF;

crcnumr++;

if(crcnumr==8)

{

R_flag1=1;

R_flag=0;

}

}

4.通过UART中断完成单片机应答上位机

首先计算校验码,若校验码正确,计算应答指令每位的值,存入Crc_TX[]中。

void RX_TX()

{

unsigned int b;

In_CRC(); //计算上位机发送数据的校验码

if((CRCHi8 == Crc_RX[crcnumr-2])&&(CRCLo8 == Crc_RX[crcnumr-1]))

{ //若校验码正确

for(b=0;b<2;b++)

{

Crc_TX[b] = Crc_RX[b];

}

Bytenum(); //计算单片机应答的字节数

Out_CRC(); //计算单片机应答数据的校验码

}

}

void RTU_T() //通过该程序将Crc_TX[]发送到上位机

{

int i;

int j;

RX_TX();

for(j=0;j<=200;j++) ; // 延时4毫秒——发送开始

for(i=0;i<=(crcnumt+1);i++)

{

while (!(UCA1IFG & UCTXIFG)); // 判断是否发送完毕

UCA1TXBUF =Crc_TX[i];

}

modbus_通讯协议_实例

上海安标电子有限公司 ——PC39A接地电阻仪通信协议 通信协议: 波特率:9600数据位:8校验位:无停止位:1 上位机(计算机): 字节号 1 2 3 4 5 6 7 8 意义ID Command 数据地址V alue CRC 注:1 ID:1个字节,由单机来定(0~255) 2 Command:1个字节,读:3或4,写:6 3 数据地址:2个字节,寄存器地址,读从100开始,写从200开始 4 V alue:2个字节,读:个数(以整型为单位),写:命令/ 数据(以整型为单位) 5 CRC:计算出CRC 下位机(PC39A): 读数据,若正确 字节号 1 2 3 3+N (N=个数*2) 3+N+1 3+N+2 意义ID Command=3 / 4 数据个数数据CRC 注:1 ID:1个字节,由单机来定(0~255) 2 Command:1个字节,收到的上位机命令 3数据个数:1个字节,返回数据个数(以字节为单位) 4 V alue:N个字节,是返回上位机的数据 5 CRC:计算出CRC 写命令,若正确 返回收到的数据: 若错误 字节号 1 2 3 4 5 意义ID Command 数据CRC 注:1 ID:1个字节,由单机来定(0~255) 2 Command:1个字节,收到的上位机命令或上0x80, 如收到3,返回0x83 3数据:1个字节,错误的指令 错误指令 1:表示command不存在 2:表示数据地址超限 4 CRC:计算出CRC

例如读PC39A 电流数据: 机器地址为12,电流的数据地址100,数据为15.45(A) (一个整型数据) 主机: ID Command 数据地址 V alue CRC 16进制 0x0c 0x03 0x0064 0x0001 CRC_H CRC_L 10进制 12 3 100 1 CRC_H CRC_L 从机返回 如正确: ID Command 数据个数(以字节为单位) V alue CRC 16进制 0x0c 0x03 0x002 0x0609 CRC_H CRC_L 10进制 12 3 2 1545 CRC_H CRC_L 如错误: ID Command 数据 CRC 16进制 0x0c 0x83 0x02 CRC_H CRC_L 10进制 12 131 2 CRC_H CRC_L 例如发PC39A 启动命令: 机器地址为12,命令的地址200,数据为25000(25000表示启动) 主机: ID Command 数据地址 V alue CRC 16进制 0x0c 0x06 0x00c8 0x61a8 CRC_H CRC_L 10进制 12 6 200 25000 CRC_H CRC_L 从机返回 如正确: ID Command 数据地址 V alue CRC 16进制 0x0c 0x06 0x00c8 0x61a8 CRC_H CRC_L 10进制 12 6 200 25000 CRC_H CRC_L 如错误: ID Command 数据 CRC 16进制 0x0c 0x86 0x02 CRC_H CRC_L 10进制 12 134 2 CRC_H CRC_L 0011 10000110 错误码0x83 功能码0x06错误码0x86

基于Modbus协议实现单片机与PLC之间的通讯

基于Modbus协议实现单片机与PLC之间的通讯 来源:PLC&FA 作者:蔡晓燕赵兴群万遂人董鹏云 关键词:可编程控制器 Modbus 通讯协议 1 引言 HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。 2 Modbus通讯协议[4] Modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。 Modbus协议提供了主—从原则,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。主设备查询的格式:设备地址(或广播,此时不需要回应)、功能代码、所有要发送的数据、和一错误检测域。从设备回应消息包括确认地址、功能码、任何要返回的数据、和一错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。 控制器能设置为两种传输模式:ASCII和RTU,在同样的波特率下,RTU可比ASCII方式传送更多的数据,所以采用KTU模式。 (1) 典型的RTU消息帧 典型的RTU消息帧如表1所示。

RTU消息帧的地址域包含8bit。可能的从设备地址是0...127(十进制)。其中地址0是用作广播地址,以使所有的从设备都能认识。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。 RTU消息帧中的功能代码域包含了8bits,当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为;当从设备回应时,它使用功能代码域来指示是正常回应(无误)还是有某种错误发生(称作异议回应,一般是将功能码的最高位由0改为1)。 从主设备发给从设备消息的数据域包含附加的信息:从设备必须用于进行执行由功能代 码所定义的行为。这包括了像不连续的寄存器地址,要处理项的数目,域中实际数据字节数。如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。 当选用RTU模式作字符帧时,错误检测域包含一16Bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测(CRC)方法得出的。CRC域附加在消息的最后,添加时先是低字节然后是高字节。 (2) 所有的Modbus功能码 Modbus的功能码定义如表2所示。

(完整版)MODBUS通讯协议-RTU要点

Modbus 通讯协议 (RTU传输模式)本说明仅做内部参考,详细请参阅英文版本。

第一章Modbus协议简介 Modbus 协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络(例如以太网)和其它设备之间可以通信。它已经成为一通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 此协议定义了一个控制器能认识使用的消息结构,而不管它们是经过何种网络进行通信的。它描述了一控制器请求访问其它设备的过程,如果回应来自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式。 当在一Modbus网络上通信时,此协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成反馈信息并用Modbus协议发出。在其它网络上,包含了Modbus协议的消息转换为在此网络上使用的帧或包结构。这种转换也扩展了根据具体的网络解决节地址、路由路径及错误检测的方法。 协议在一根通讯线上使用应答式连接(半双工),这意味着在一根单独的通讯线上信号沿着相反的两个方向传输。首先,主计算机的信号寻址到一台唯一的终端设备(从机),然后,在相反的方向上终端设备发出的应答信号传输给主机。协议只允许在主计算机和终端设备之间,而不允许独立的设备之间的数据交换,这就不会在使它们初始化时占据通讯线路,而仅限于响应到达本机的查询信号。 1.1 传输方式 传输方式是一个信息帧内一系列独立的数据结构以及用于传输数据的有限规则,以RTU 模式在Modbus总线上进行通讯时,信息中的每8位字节分成2个4位16进制的字符,每个信息必须连续传输下面定义了与Modebus 协议– RTU方式相兼容的传输方式。 代码系统 ?8位二进制,十六进制数0...9,A...F ?消息中的每个8位域都是一个两个十六进制字符组成 每个字节的位 ?1个起始位 ?8个数据位,最小的有效位先发送 ?1个奇偶校验位,无校验则无 ?1个停止位(有校验时),2个Bit(无校验时) 错误检测域 ?CRC(循环冗长检测)

很好的威纶通MODBUSRTU通讯协议与变频器通讯案例

很好的威纶通 M O D B U S R T U通讯协议与变频器通讯案例 公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

本文研究的是触摸屏通过MODBUS RTU通讯协议与变频器通讯实现变频器的控制。触摸屏采用威纶通TK6070IP,变频器用汇川MD380通用系列。通过触摸屏编程软件,编辑控制画面实现变频器的启动、停止、速度调节、多段速速度设置,通过宏指令实现工程值与实际值的转换。 一、MODBUS RTU 简介: 为了在自动化系统之间、自动化系统和所连接的分散的现场设备之间进行信息交换,如今串行现场总线被主要用作通讯系统。成千上万的应用已经强烈地证明了通过使用现场总线技术,可以节省多至40%的接线、调试及维护的费用。仅仅使用两根电线就可以传送现场设备的所有相关信息,比如输入和输出数据、参数、诊断数据。过去使用的现场总线往往是制造商的特定现场总线,并且同其它现场总线不兼容。如今使用的现场总线几乎是完全公开和标准化的。这就意味者用户可以以最合理的价格选择最好的产品,而不用依赖于每个独立的制造商。Modbus RTU是一种国际的、开放的现场总线标准。作为一种很容易实现的现场总线协议,在全世界范围内,Modbus得到了成功的应用。应用领域包括生产过程中的自动化、过程控制和楼宇自控。MODBUS RTU通讯协议的报文如图1。 图1 MODBUS RTU 通讯协议的报文功能码如下: 01H 读取线圈状态。从执行机构上读取线圈(单个位)的内容; 02H 读取离散量输入。从执行机构上读取离散量输入(多个位)的内容; 03H 读取保持寄存器。从执行机构上读取保持寄存器(16位字)的内容; 04H 读取输入寄存器。从执行机构上读取输入寄存器(16位字)的内容; 05H 强置单线圈。写数据到执行机构的线圈(单个位)为“通”(“1”)或“断”(“0”); 06H 预置单寄存器。写数据到执行机构的单个保持寄存器(16位字); 0FH 强置多线圈。写数据到执行机构的几个连续线圈(单个位)为“通”(“1”) 或“断”(“0”); 10H 预置多寄存器。写数据到执行机构的几个连续的保持寄存器(16位字)。 二、威纶通编程软件介绍: EB8000软件中MODBUS协议的设备类型为0x、1x、3x、4x、5x、6x,还有 3x_bit,4x_bit,6x_bit,0x_multi_coils等,下面分别说明这些设备类型在MODBUS协议中支持哪些功能码。 0x:是一个可读可写的设备类型,相当于操作PLC的输出点。该设备类型读取位状态的时候,发出的功能码是01H,写位状态的时候发出的功能码是05H。写多个寄存器时发出的功能码是0fH。

modbus协议下上位机编程实例

竭诚为您提供优质文档/双击可除modbus协议下上位机编程实例 篇一:modbus协议下的上位机地址 Rs485采取流量计数据,经串口com1的2号地址读到int ouch中来,双字40001、40002为浮点型瞬时流量,读到上位机项目为40001F双字40004、40005为长整型累计流量,读到上位机项目为40004l 驱动设置与intouch标记名的设置 驱动设置: 项目名设置 注:在不修改驱动设置的情况下,s=s1+s2*65535 s=s2+s1*65535 根据各个厂家的仪表,上面工式有区别,设计时各个测试一下。 篇二:modbus通讯协议实例 上海安标电子有限公司 ——pc39a接地电阻仪通信协议 通信协议:

波特率:9600数据位:8校验位:无停止位:1 上位机(计算机): 注:1id:1个字节,由单机来定(0~255) 2command:1个字节,读:3或4,写:6 3数据地址:2个字节,寄存器地址,读从100开始,写从200开始4Value:2个字节,读:个数(以整型为单位),写:命令/数据(以整型为单位)5cRc:计算出cRc下位机(pc39a ):注:1id:1个字节,由单机来定(0~255) 2command:1个字节,收到的上位机命令 3数据个数:1个字节,返回数据个数(以字节为单位)4Value:n个字节,是返回上位机的数据5cRc:计算出cRc 写命令,若正确返回收到的数据:若错误注:1id:1个字节,由单机来定(0~255) 2command:1个字节,收到的上位机命令或上0x80, 如收到3,返回0x83 3数据:1个字节,错误的指令错误指令 1:表示command不存在2:表示数据地址超限 4cRc:计算出cRc 例如读pc39a电流数据: 机器地址为12,电流的数据地址100,数据为15.45(a)(一个整型数据)

Modbus通讯协议(TCP和RTU)

1MODBUS RTU 读寄存器请求序号意义所占字节字节存放格式 1从设备地址1个字节0x00?0xff 2功能码1个字节0x03 3起始寄存器基地址两个字节高字节在前 4寄存器个数两个字节高字节在前 5CRC校验码两个字节低字节在前 读寄存器回应序号意义所占字节字节存放格式1从设备地址1个字节0x00?0xff 2功能码1个字节0x03 3数据长度1个字节寄存器个数×2 4数据寄存器个数×2个字节每个寄存器高字节在前5CRC校验码两个字节低字节在前 写单个寄存器请求序号意义所占字节字节存放格式1从设备地址1个字节0x00?0xff 2功能码1个字节0x06 3起始寄存器地址两个字节高字节在前 4寄存器值两个字节 高字节在前 5CRC校验码 两个字节 低字节在前 写单个寄存器回应序号意义所占字节字节存放格式1从设备地址1个字节0x00?0xff 2功能码1个字节0x10 3起始寄存器地址两个字节高字节在前 4寄存器值两个字节 高字节在前 5CRC校验码 两个字节 低字节在前 1

写多个寄存器请求序号意义所占字节字节存放格式1从设备地址1个字节0x00?0xff 2功能码1个字节0x10 3起始寄存器地址两个字节高字节在前 4寄存器个数两个字节 高字节在前 5数据长度 1个字节 寄存器个数×2  6数据寄存器个数×2个字节每个寄存器高字节在前7CRC校验码 两个字节 低字节在前 写多个寄存器回应序号意义所占字节字节存放格式1从设备地址1个字节0x00?0xff 2功能码1个字节0x10 3起始寄存器地址两个字节高字节在前 4寄存器个数两个字节 高字节在前 5CRC校验码 两个字节 低字节在前 错误返回序号意义所占字节字节存放格式1从设备地址1个字节0x00?0xff 2功能码1个字节请求功能码+0x80 3错误码1个字节 其代号见下面表格4CRC校验码 两个字节 低字节在前 错误代号错误代号意义 0x01不支持该功能码 0x02越界 0x03寄存器数量超出范围 0x04读写错误 2

电磁流量计实用标准MODBUS通讯协议详情(1)

电磁流量计转换器 通讯协议 2012-10-12

目录 一、概述................................................................................................. - 2 - 二、网络结构及接线................................................................................ - 2 -

三、Modbus协议RTU帧格式 .............................................................. - 2 - 四、Modbus协议命令编码定义............................................................. - 4 - 五、电磁流量计MODBUS寄存器定义 ................................................... - 5 - 1. 电磁流量计MODBUS寄存器地址定义............................................... - 5 - 2.PLC地址设置说明................................................................................ - 5 - 3.组态王地址设置说明............................................................................. - 6 -4.数据含义说明 .................................................................................... - 6 -六、通讯数据解析................................................................................... - 7 -1读瞬时流量 .......................................................................................... - 7 -2.读瞬时流速:....................................................................................... - 8 -3读累积流量 .......................................................................................... - 8 - 5.读总量流量单位 ................................................................................. - 10 - 6.读报警状态 ........................................................................................ - 10 - 七、应用举例........................................................................................ - 11 - 1.C语言MODBUS 示例程序............................................................... - 11 - 2.modbus调试软件modbus poll通讯实例....................................... - 13 - 3.modbus调试软件modscan32通讯实例 ......................................... - 15 - 4.组态王6.53通讯实例 ........................................................................ - 17 - 5.力控 6.1通讯实例.............................................................................. - 21 -

modbus通讯协议

Modbus通讯协议 图片: 图片: 图片:

Modbus协议最初由Modicon公司开发出来,在1979年末该公司成为施耐德自动化(Schneider Automation)部门的一部分,现在Modbus已经是工业领域全球最流行的协议。此协议支持传统的RS-232、RS-422、RS-485和以太网设备。许多工业设备,包括PLC,DCS,智能仪表等都在使用Modbus协议作为他们之间的通讯标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。 当在网络上通信时,Modbus协议决定了每个控制器须要知道它们的设备地址,识别按地址发来的消息,决定要产生何种行动。如果需要回应,控制器将生成应答并使用Modbus协议发送给询问方。 Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master 端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。

Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP模式没有额外规定校验,因为TCP 协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。 下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。 下表是ASCII协议和RTU协议进行的比较: 通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII 字符,RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。

MODBUS标准通讯协议

MODBUS 标准通讯协议(简版) (基于Modbus 应用协议RTU 通讯模式) 1. 前言 本协议适用于符合MODBUS 标准通讯协议的规定以及在Modbus 网络上以RTU 模式通信运行的设备和应用软件。本协议按照Modbus 应用协议标准制定。 2. 波特率可选范围 代码 6 7 8 9 10 11 12 13 14 波特率 2400 4800 9600 14400 19200 28800 38400 57600 115200 3. RTU 通讯数据传输模式 3.1 RTU 模式每个字节( 11 位 )的格式为 : 通讯传输为异步方式,并以字节(数据帧)为单位。在主站和从站之间传递的每一个数据帧都是11位的串行数据流。 编码系统: 8–位二进制,报文中每个8 位字节含有两个4 位十六进制字符(0–9, A –F) 数 据 位: 1个 起始位 8个 数据位, 首先发送最低有效位 1个 奇偶校验(注:偶校验是要求的,其它模式( 奇校验,无校验 )也可以使用) 1个 停止位 (注 :使用无校验时要求2个停止位) 帧校验域:循环冗余校验(CRC) 3.2 字符的串行传送方式: 每个字符或字节按如下顺序发送(从左到右):最低有效位 (LSB) . . . 最高有效位 (MSB) 通过配置,设备可以接受奇校验、偶校验或无校验。如果无奇偶校验,那么传送一个附加的停止位来填充数据帧使其成为完整的11位异步字符: 3.3 数据编码: Modbus 处理的所有数据按照存储数据的类型可以分为位寄存器(容量为1位)和16位寄存器(容量为16位)两种,它们的宽度都是16位(Data is packed as two bytes per register),协议允许单个选择65536个数据项,而且其读写操作可以越过多个连续数据项直到数据大小规格限制,这个数据大小规格限制与事务处理功能码有关。在Modbus PDU 中从0~65535寻址每个数据。 Modbus 使用一个‘big-Endian ’表示地址和数据项,即最高有效字节在低地址存储,最低有效字节在高字节存储。这意味着当发送多个字节时,首先发送最高有效位例如: 寄存器大小 值 16位 0x1234 发送的第一字节为0x12,然后发0x34。 4. RTU 报文帧结构 Modbus RTU 报文帧格式如下: 地址码 功能码 数据区 错误校验码 2 字节 1字节 1字节 0到252字节 CRC 低 CRC 高

Modbus协议讲解

Modbus协议讲解 一、基本术语 1、字word、字节byte、位bit 1 word = 2 byte; 1 byte = 8 bit. 2、校验码 校验码是由前面的数据通过某种算法得出的,用以检验该组数据的正确性。代 码作为数据在向计算机或其它设备进行输入时,容易产生输入错误,为了减少 这种输入错误,编码专家发明了各种校验检错方法,并依据这些方法设置了校 验码。 常用的校验有:累加和校验SUM、字节异或校验XOR、纵向冗余校验LRC、循环冗余校验CRC…… 3、协议和接口 协议是一种规范和约定,是一种通讯的语言,规定了通信双方能够识别并使用 的消息结构和数据格式。 接口是一种设备的物理连接,指的是在物理层上的定义,像 RS422/RS232/RS485/以太网口等。协议和接口并不是一个概念,不能混淆。 Modbus协议一般运行在RS485物理接口上,半双工的,是一种主从协议。 二、Modbus协议概述

Modbus协议是应用于电子控制器上的一种通用语言,实现控制器之间、控制器由网络和其它设备之间的通信,支持传统的RS232/RS422/RS485和最新发展的以太网设备。它已经成为一种通用工业标准。有了它,不同厂商生产的控制设备可以连成工业网络,进行集中控制。此协议定义了一个控制器能认识使用的消息结构。 Modbus协议是一种请求——应答方式的协议。 三、两种传输方式 1、ASCII模式 ASCII:美国标准信息交换代码 特点: ②消息中每个8bit都作为两个ASCII字符发送 ②1个起始位、7个数据位、1个奇偶校验位和1个停止位(或者两个停止位) ③错误检测域是LRC检验 ④字符发送的时间间隔可达到1秒而不会产生错误 2、RTU模式 RTU:远程终端单元 特点: ①消息中每个8bit字节包含两个4bit的十六进制字符,因此,在波特率相 同的情况下,传输效率比ascii传输方式大 ②1个起始位、8个数据位、1个奇偶校验位和1个停止位(或者两个停 止位)

2019很好的威纶通MODBUS RTU通讯协议与变频器通讯案例

本文研究的是触摸屏通过MODBUS RTU通讯协议与变频器通讯实现变频器的控制。触摸屏采用威纶通TK6070IP,变频器用汇川MD380通用系列。通过触摸屏编程软件,编辑控制画面实现变频器的启动、停止、速度调节、多段速速度设置,通过宏指令实现工程值与实际值的转换。 一、MODBUS RTU 简介: 为了在自动化系统之间、自动化系统和所连接的分散的现场设备之间进行信息交换,如今串行现场总线被主要用作通讯系统。成千上万的应用已经强烈地证明了通过使用现场总线技术,可以节省多至40%的接线、调试及维护的费用。仅仅使用两根电线就可以传送现场设备的所有相关信息,比如输入和输出数据、参数、诊断数据。过去使用的现场总线往往是制造商的特定现场总线,并且同其它现场总线不兼容。如今使用的现场总线几乎是完全公开和标准化的。这就意味者用户可以以最合理的价格选择最好的产品,而不用依赖于每个独立的制造商。Modbus RTU是一种国际的、开放的现场总线标准。作为一种很容易实现的现场总线协议,在全世界范围内,Modbus得到了成功的应用。应用领域包括生产过程中的自动化、过程控制和楼宇自控。MODBUS RTU通讯协议的报文如图1。图1 MODBUS RTU 通讯协议的报文功能码如下: 01H 读取线圈状态。从执行机构上读取线圈(单个位)的内容; 02H 读取离散量输入。从执行机构上读取离散量输入(多个位)的内容; 03H 读取保持寄存器。从执行机构上读取保持寄存器(16位字)的内容; 04H 读取输入寄存器。从执行机构上读取输入寄存器(16位字)的内容; 05H 强置单线圈。写数据到执行机构的线圈(单个位)为“通”(“1”)或 “断”(“0”); 06H 预置单寄存器。写数据到执行机构的单个保持寄存器(16位字); 0FH 强置多线圈。写数据到执行机构的几个连续线圈(单个位)为“通”(“1”) 或“断”(“0”); 10H 预置多寄存器。写数据到执行机构的几个连续的保持寄存器(16位字)。 二、威纶通编程软件介绍: EB8000软件中MODBUS协议的设备类型为0x、1x、3x、4x、5x、6x,还有3x_bit,4x_bit,6x_bit,0x_multi_coils 等,下面分别说明这些设备类型在MODBUS协议中支持哪些功能码。 0x:是一个可读可写的设备类型,相当于操作PLC的输出点。该设备类型读取位状态的时候,发出的功能码是01H,写位状态的时候发出的功能码是05H。写多个寄存器时发出的功能码是0fH。 1x:是一个只读的设备类型,相当于读取PLC的输入点。读取位状态的时候发出的功能码为02H。 3x:是一个只读的设备类型,相当于读取PLC的模拟量。读数据的时候,发出的功能码是04H。 4x:是一个可读可写的设备类型,相当于操作PLC的数据寄存器。当读取数据的时候,发出的功能码是03H,当写数据的时候发出的功能码时10H,可写多个寄存器的数据。 6x:是一个可读可写的设备类型,读取数据的时候,发出的功能码也是03H,与4x不同之处在于写数据的时候发出的功能码时06H,即写单个寄存器的数据。 三、变频器参数设置: F0-02 命令源选择为:通讯命令通道(1正转运行、2反转运行、3正转点动、4反转点动、5自由停车、6减速停机); F0-03 主频率源选择为:通讯给定; F0-28 串口通讯协议选择:MODBUS 协议; Fd-00 通讯波特率:9600 BPS; Fd-01 MODBUS 数据格式:偶校检(8-E-1); Fd-02 本机地址:1 Fc-00—Fc-15 1到16段多段速运行速度

关于51单片机上实现modbus协议

你找一个MODBUS的协议详细资料好好看看,就是一种通讯约定,你按照它规定的格式通讯就可以了 协议发送给询问方。Modbus协议包括ASCII、RTU、TCP等,并没有规定物理层。此协议定义了控制器能够认识和使用的消息结构,而不管它们是经过何种网络进行通信的。标准的Modicon控制器使用RS232C实现串行的Modbus。Modbus的ASCII、RTU协议规定了消息、数据的结构、命令和就答的方式,数据通讯采用Maser/Slave方式,Master端发出数据请求消息,Slave端接收到正确消息后就可以发送数据到Master端以响应请求;Master端也可以直接发消息修改Slave端的数据,实现双向读写。Modbus协议需要对数据进行校验,串行协议中除有奇偶校验外,ASCII模式采用LRC校验,RTU模式采用16位CRC校验,但TCP 模式没有额外规定校验,因为TCP协议是一个面向连接的可靠协议。另外,Modbus采用主从方式定时收发数据,在实际使用中如果某Slave站点断开后(如故障或关机),Master端可以诊断出来,而当故障修复后,网络又可自动接通。因此,Modbus协议的可靠性较好。下面我来简单的给大家介绍一下,对于Modbus的ASCII、RTU和TCP协议来说,其中TCP 和RTU协议非常类似,我们只要把RTU协议的两个字节的校验码去掉,然后在RTU协议的开始加上5个0和一个6并通过TCP/IP网络协议发送出去即可。所以在这里我仅介绍一下Modbus的ASCII和RTU协议。下表是ASCII协议和RTU协议进行的比较:协议开始标记结束标记校验传输效率程序处理 ASCII :(冒号)CR,LF LRC 低直观,简单,易调试 RTU 无无CRC 高不直观,稍复杂 通过比较可以看到,ASCII协议和RTU协议相比拥有开始和结束标记,因此在进行程序处理时能更加方便,而且由于传输的都是可见的ASCII字符,所以进行调试时就更加的直观,另外它的LRC校验也比较容易。但是因为它传输的都是可见的ASCII字符,RTU传输的数据每一个字节ASCII都要用两个字节来传输,比如RTU传输一个十六进制数0xF9,ASCII 就需要传输’F’’9’的ASCII码0x39和0x46两个字节,这样它的传输的效率就比较低。所以一般来说,如果所需要传输的数据量较小可以考虑使用ASCII协议,如果所需传输的数据量比较大,最好能使用RTU协议。 下面对两种协议的校验进行一下介绍。 1、LRC校验 LRC域是一个包含一个8位二进制值的字节。LRC值由传输设备来计算并放到消息帧中,接收设备在接收消息的过程中计算LRC,并将它和接收到消息中LRC域中的值比较,如果两值不等,说明有错误。 LRC校验比较简单,它在ASCII协议中使用,检测了消息域中除开始的冒号及结束的回车换行号外的内容。它仅仅是把每一个需要传输的数据按字节叠加后取反加1即可。下面是它的VC代码: BYTE GetCheckCode(const char * pSendBuf, int nEnd)//获得校验码 {

相关主题
文本预览
相关文档 最新文档