通用单片机通讯协议(ASCII)

组态王与单片机协议

1.通讯口设置:

通讯方式:RS-232,RS-485,RS-422均可。

波特率: 由单片机决定(2400,4800,9600and19200bps )。

程中的通讯参数一致

2.在组态王中定义设备地址的格式 格式:##.#

前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定 ;

后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包, 用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。

注意:在组态王中定义变量时,一个X 寄存器根据所选数据类型(BYTE,UINT,FLOAT )的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。为提高通讯速度建议用户使用连续的数据区。 例如,

1、在单片机中定义从地址0开始的数据类型为BYTE 型的变量: 则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE ,每个变量占一个字节

2、在单片机中定义从地址100开始的数据类型为UINT 型的变量:

则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT ,每个变量占两个字节

3、在单片机中定义从地址200开始的数据类型为FLOAT 型的变量: 则在组态王中定义相应的变量的寄存器为X200、X204、X208、X212。。。。。。。, 数据类型FLOAT ,每个变量占四个字节

3.组态王与单片机通讯的命令格式:

说明;

字头:1字节1个ASCII 码,40H

设备地址: 1字节2个ASCII 码,0—255(即0---0x0ffH ) 标志:1字节2个ASCII 码,bit0~bit7,

bit0= 0:读,bit0= 1:写。 bit1= 0:不打包。

bit3bit2 = 00,数据类型为字节。 bit3bit2 = 01,数据类型为字。

bit3bit2 = 1x,数据类型为浮点数。

数据地址: 2字节4个ASCII 码,0x0000~0xffff

数据字节数:1字节2个ASCII 码,1—100,实际读写的数据的字节数。 数据…:为实际的数据转换为ASCII 码,个数为字节数乘2。

异或:异或从设备地址到异或字节前,异或值转换成2个ASCII 码 CR :0x0d 。

通讯尝试恢复命令(COMERROR ) ,请求地址为0的一个BYTE 数据

100,数据类型为字节,不打包。组态王所发

100,数据类型为字节,打包。组

,数据类型为字,不打包。组态王所发数

65535,数据类型为浮点型,打包。组态王所

4字节浮点数 = 第一字节高4位ASCII 码+第一字节低4位ASCII 码

+第二字节高4位ASCII 码+第二字节低4位ASCII 码 +第三字节高4位ASCII 码+第三字节低4位ASCII 码

+第四字节高4位ASCII 码+第四字节低4位ASCII 码

第14位 第24位

第34位 第44位

第四字节浮点数格式:(1)第一字节 (

2)第二字节(3)第三字节(4)第四字节

注:数符=0——正,数符=1——负

阶符=0——正,阶符=1——负

D7 D6 D5 ~ D0 ★ 浮点数可表示范围:-1×232

~1×232

★ 数符:1位 阶符:1位 阶码:

6位 例:流量积算控制仪表瞬时流量测量值数据=100.210

转换成浮点数:100.210=27⨯0.7828125=0716+C816+6616+6616

=30ASCII +37ASCII +43ASCII +38ASCII +36ASCII +36ASCII +36ASCII +36ASCII

小数部份:0.7828125 ⇒⨯256=200.4⇒ 0.4⨯256=102.4⇒0.4⨯256=102.4 小数部分乘以256

整数部份为第二字节(200)

第二字节小数部分乘以256

整数部份为第三字节(102)

第三字节小数部分乘以256

整数部份为第四字节 (102)

10进制: 第一字节 第二字节 第三字节 第四字节

十六进制: ASCII 码: 第一字节 第二字节 第三字节

第四字节

传输格式如下:

第1字节低4位 第2字节低4位 第3字节低4位 第4字节低4位

第1字节高4位 第2字节高4位 第3字节高4位 第4字节高4位

3、注:

仪表内部数据为十六进制表示的十进制数。如:实时测量值为500,则用十六进制表示为1F4H 。仪表通讯传输是将上述十六进制数据转化为标准ASCII 码(即一字节的16进制数转化为2个ASCII 码──高4位ASCII 码+低4位ASCII 码)。

如:上述数据1F4H (16进制 ),传输时,转化为ASCII 码则为30H 、31H 、46H 、34H 。

6.此浮点数格式的转换:

1)ASCII 码到浮点数: /*

in:char* c

要转化的ASII 码字符,应为4个字符。 Return :转换后的浮点数。 */

float C4toD(char * c) { BYTE Hd[30], Jiema[30]; float DTc[30]; float Decimal = 0; memset(Hd, 0, sizeof(Hd)); memset(Jiema, 0, sizeof(Jiema)); memset(DTc, 0, sizeof(DTc)); float returnflo = 0;

BOOL ShuFU = FALSE, JieFU = FALSE; if((c[7] > 0x40) && (c[7] 0x60) && (c[7] 0x40) && (c[6] 0x60) && (c[6] 0x40) && (c[5]

else if((c[5] > 0x60) && (c[5] 0x40) && (c[4] 0x60) && (c[4]

DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0); if((c[3] > 0x40) && (c[3] 0x60) && (c[3] 0x40) && (c[2] 0x60) && (c[2]

Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0); if((c[1] > 0x40) && (c[1] 0x60) && (c[1] 0x40) && (c[0] 0x60) && (c[0] > 3) > 0; JieFU = ((Jiema[0] & 0x04) >> 2) > 0;

Jiema[2] = (Jiema[0] & 0x03) * 16 + Jiema[1]; if(JieFU) returnflo = (float)pow(2, (-1) * Jiema[2]) * Decimal; else returnflo = (float)pow(2, Jiema[2]) * Decimal; if(ShuFU)

returnflo = (-1) * returnflo; return returnflo; }

2)浮点数到ASCII 码: /*

in:char * c:

存储浮点数转换后的ASCII 码字符。 Float d:

要转换的浮点数。 Return : 无。 */

void D4toC(char * c,float d) {

BYTE i = 0, Jiema = 0; char inbyte1[30]; BOOL ShuFu = FALSE, JieFu = FALSE; int inbyte2 = 0, inbyte3 = 0, inbyte4 = 0; char afterbyte2[30], afterbyte3[30], afterbyte4[30]; float F_afterbyte2 = 0, F_afterbyte3 = 0, F_afterbyte4 = 0; memset(inbyte1, 0x30, sizeof(inbyte1)); memset(afterbyte2, 0x30, sizeof(afterbyte2)); memset(afterbyte3, 0x30, sizeof(afterbyte3)); memset(afterbyte4, 0x30, sizeof(afterbyte4)); inbyte1[10] = 0x0; afterbyte2[10] = 0x0; afterbyte3[10] = 0x0; afterbyte4[10] = 0x0; if(d == 0) { for(int j = 0; j 1) { d =(float)(d / 2.0); i ++; } while(d

JieFu = TRUE; d = (float)(d * 2.0); i ++; }

if(d == 1) { for(int j = 2; j

} else { c[4] = afterbyte3[0]; c[5] = afterbyte3[1]; } if(inbyte4 == 0) { c[6] = 0x30; c[7] = 0x30; } else if(inbyte4

if(JieFu) { if(i > 0x3f) i = 0x3f; }

else if(i > 0x32) i = 32; if(ShuFu) i = i | 0x80; if(JieFu) i = i | 0x40; itoa(i, inbyte1, 16); if(inbyte1 == 0) { c[0] = 0x30; c[1] = 0x30; }

else if(i

else { c[0] = inbyte1[0]; c[1] = inbyte1[1]; }

for(i = 0; i 0x60) && (c[i]

c[8] = 0x00;

}

组态王与单片机协议

1.通讯口设置:

通讯方式:RS-232,RS-485,RS-422均可。

波特率: 由单片机决定(2400,4800,9600and19200bps )。

程中的通讯参数一致

2.在组态王中定义设备地址的格式 格式:##.#

前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定 ;

后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包, 用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。

注意:在组态王中定义变量时,一个X 寄存器根据所选数据类型(BYTE,UINT,FLOAT )的不同分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。为提高通讯速度建议用户使用连续的数据区。 例如,

1、在单片机中定义从地址0开始的数据类型为BYTE 型的变量: 则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE ,每个变量占一个字节

2、在单片机中定义从地址100开始的数据类型为UINT 型的变量:

则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT ,每个变量占两个字节

3、在单片机中定义从地址200开始的数据类型为FLOAT 型的变量: 则在组态王中定义相应的变量的寄存器为X200、X204、X208、X212。。。。。。。, 数据类型FLOAT ,每个变量占四个字节

3.组态王与单片机通讯的命令格式:

说明;

字头:1字节1个ASCII 码,40H

设备地址: 1字节2个ASCII 码,0—255(即0---0x0ffH ) 标志:1字节2个ASCII 码,bit0~bit7,

bit0= 0:读,bit0= 1:写。 bit1= 0:不打包。

bit3bit2 = 00,数据类型为字节。 bit3bit2 = 01,数据类型为字。

bit3bit2 = 1x,数据类型为浮点数。

数据地址: 2字节4个ASCII 码,0x0000~0xffff

数据字节数:1字节2个ASCII 码,1—100,实际读写的数据的字节数。 数据…:为实际的数据转换为ASCII 码,个数为字节数乘2。

异或:异或从设备地址到异或字节前,异或值转换成2个ASCII 码 CR :0x0d 。

通讯尝试恢复命令(COMERROR ) ,请求地址为0的一个BYTE 数据

100,数据类型为字节,不打包。组态王所发

100,数据类型为字节,打包。组

,数据类型为字,不打包。组态王所发数

65535,数据类型为浮点型,打包。组态王所

4字节浮点数 = 第一字节高4位ASCII 码+第一字节低4位ASCII 码

+第二字节高4位ASCII 码+第二字节低4位ASCII 码 +第三字节高4位ASCII 码+第三字节低4位ASCII 码

+第四字节高4位ASCII 码+第四字节低4位ASCII 码

第14位 第24位

第34位 第44位

第四字节浮点数格式:(1)第一字节 (

2)第二字节(3)第三字节(4)第四字节

注:数符=0——正,数符=1——负

阶符=0——正,阶符=1——负

D7 D6 D5 ~ D0 ★ 浮点数可表示范围:-1×232

~1×232

★ 数符:1位 阶符:1位 阶码:

6位 例:流量积算控制仪表瞬时流量测量值数据=100.210

转换成浮点数:100.210=27⨯0.7828125=0716+C816+6616+6616

=30ASCII +37ASCII +43ASCII +38ASCII +36ASCII +36ASCII +36ASCII +36ASCII

小数部份:0.7828125 ⇒⨯256=200.4⇒ 0.4⨯256=102.4⇒0.4⨯256=102.4 小数部分乘以256

整数部份为第二字节(200)

第二字节小数部分乘以256

整数部份为第三字节(102)

第三字节小数部分乘以256

整数部份为第四字节 (102)

10进制: 第一字节 第二字节 第三字节 第四字节

十六进制: ASCII 码: 第一字节 第二字节 第三字节

第四字节

传输格式如下:

第1字节低4位 第2字节低4位 第3字节低4位 第4字节低4位

第1字节高4位 第2字节高4位 第3字节高4位 第4字节高4位

3、注:

仪表内部数据为十六进制表示的十进制数。如:实时测量值为500,则用十六进制表示为1F4H 。仪表通讯传输是将上述十六进制数据转化为标准ASCII 码(即一字节的16进制数转化为2个ASCII 码──高4位ASCII 码+低4位ASCII 码)。

如:上述数据1F4H (16进制 ),传输时,转化为ASCII 码则为30H 、31H 、46H 、34H 。

6.此浮点数格式的转换:

1)ASCII 码到浮点数: /*

in:char* c

要转化的ASII 码字符,应为4个字符。 Return :转换后的浮点数。 */

float C4toD(char * c) { BYTE Hd[30], Jiema[30]; float DTc[30]; float Decimal = 0; memset(Hd, 0, sizeof(Hd)); memset(Jiema, 0, sizeof(Jiema)); memset(DTc, 0, sizeof(DTc)); float returnflo = 0;

BOOL ShuFU = FALSE, JieFU = FALSE; if((c[7] > 0x40) && (c[7] 0x60) && (c[7] 0x40) && (c[6] 0x60) && (c[6] 0x40) && (c[5]

else if((c[5] > 0x60) && (c[5] 0x40) && (c[4] 0x60) && (c[4]

DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0); if((c[3] > 0x40) && (c[3] 0x60) && (c[3] 0x40) && (c[2] 0x60) && (c[2]

Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0); if((c[1] > 0x40) && (c[1] 0x60) && (c[1] 0x40) && (c[0] 0x60) && (c[0] > 3) > 0; JieFU = ((Jiema[0] & 0x04) >> 2) > 0;

Jiema[2] = (Jiema[0] & 0x03) * 16 + Jiema[1]; if(JieFU) returnflo = (float)pow(2, (-1) * Jiema[2]) * Decimal; else returnflo = (float)pow(2, Jiema[2]) * Decimal; if(ShuFU)

returnflo = (-1) * returnflo; return returnflo; }

2)浮点数到ASCII 码: /*

in:char * c:

存储浮点数转换后的ASCII 码字符。 Float d:

要转换的浮点数。 Return : 无。 */

void D4toC(char * c,float d) {

BYTE i = 0, Jiema = 0; char inbyte1[30]; BOOL ShuFu = FALSE, JieFu = FALSE; int inbyte2 = 0, inbyte3 = 0, inbyte4 = 0; char afterbyte2[30], afterbyte3[30], afterbyte4[30]; float F_afterbyte2 = 0, F_afterbyte3 = 0, F_afterbyte4 = 0; memset(inbyte1, 0x30, sizeof(inbyte1)); memset(afterbyte2, 0x30, sizeof(afterbyte2)); memset(afterbyte3, 0x30, sizeof(afterbyte3)); memset(afterbyte4, 0x30, sizeof(afterbyte4)); inbyte1[10] = 0x0; afterbyte2[10] = 0x0; afterbyte3[10] = 0x0; afterbyte4[10] = 0x0; if(d == 0) { for(int j = 0; j 1) { d =(float)(d / 2.0); i ++; } while(d

JieFu = TRUE; d = (float)(d * 2.0); i ++; }

if(d == 1) { for(int j = 2; j

} else { c[4] = afterbyte3[0]; c[5] = afterbyte3[1]; } if(inbyte4 == 0) { c[6] = 0x30; c[7] = 0x30; } else if(inbyte4

if(JieFu) { if(i > 0x3f) i = 0x3f; }

else if(i > 0x32) i = 32; if(ShuFu) i = i | 0x80; if(JieFu) i = i | 0x40; itoa(i, inbyte1, 16); if(inbyte1 == 0) { c[0] = 0x30; c[1] = 0x30; }

else if(i

else { c[0] = inbyte1[0]; c[1] = inbyte1[1]; }

for(i = 0; i 0x60) && (c[i]

c[8] = 0x00;

}


相关内容

  • 组态王6.53与51单片机
  • 基于51单片机的智能仪表与组态王的通讯 1242人阅读 | 0条评论 发布于:2009-8-10 23:01:00 1.引言 随着工业自动化进程的不断加快,现场仪器.仪表.设备正不断向数字化.智能化和网络化方向推进. 单片机以其强大的现场数据处理能力,低廉的价格,紧凑的系统结构.高度的灵活性,微小的 ...

  • 工业以太网多路模拟信号采集隔离转换器
  • 以太网多路模拟信号采集隔离变送器 物联网/局域网模拟量采集隔离变送器:SY AD 08-RJ45 产品特点 ● 4-20mA等模拟量直接转为以太网和总线通讯数字量 ● 典型应用 ● 支持10M以太网RJ45接口,支持Modbus TCP通讯协议 ● 支持RS 485/RS 232串口扩展,支持Mod ...

  • 计算机文化基础模拟题(开卷)
  • <计算机文化基础>模拟题(补) 一. 单项选择题 1. 世界上第一台通用的.完全电子的计算机是由美国宾西法尼亚大学研制的[ ]. A .ABC B .PC C .ENIAC D .巨人 2. 第一个微处理器于1971年由[ ]公司生产. A .IBM B .Intel C .APPLE ...

  • 感谢班长感谢党
  • 4.1 字模简介 文字的字模是一组数字,但是字模的意义又和数字的意义完全不同,字模指的是利用数字的各位信息去记载英文或汉字的形状. 电脑硬件没有英文的概念,也没有汉字的概念.电脑认识的概念只有"内码".汉字的内码是将ASCII表中高128位很少用到的数值以两个为一组来表示汉字.英 ...

  • 全国计算机等级考试一级模拟试题
  • 计算机等级考试一级B 模拟试题一 (1)计算机的特点是处理速度快.计算精度高.存储容量大.可靠性高.工作全自动以及 A )造价低廉 B )便于大规模生产 C )适用范围广.通用性强 D )体积小巧 [答案]:C [解析]:计算机的主要特点就是处理速度快.计算精度高.存储容量大.可靠性高.工作全自动以 ...

  • 无线收发模块
  • PTR2000 超小型.超低功耗.高速率19.2K无线收发数传MODEM 一.产品特性! 接收发射合一 ! 工作频率为国际通用的数传频段433MHz ! FSK调制,抗干扰能力强,特别适合工业控制场合! 采用DDS+PLL频率合成技术,频率稳定性极好.! 灵敏度高,达到-105dBm! 最大发射功率 ...

  • PLC通讯数据格式
  • 异步传输的位数一般指数据位,分为7位和8位两种,不包括起始.校验.和停止,比如要传送的数据是7位,你传输后得到的数据也是7位,对应到1个字节,应把最高位设置成0:这是RS232的标准,实际传输的时候的顺序是这样:1位起始位.数据0.数据1.....数据7.1位偶校验.1位停止位,到此传输结束,如果还 ...

  • 详解地铁列车LED显示屏的设计
  • 详解地铁列车LED 显示屏的设计 [大比特导读]目前在国内运行的地铁车辆普遍都配备了LED 显示屏,但附加功能较少,屏幕显示内容单一.为了配合新型地铁旅客信息系统的使用,我们设计了一种全新的多总线式LED 显示动态屏. 1 引 言 LED 显示屏在地铁中作为一种面向公众的信息显示终端,有着非常广泛的 ...

  • hart ,modbus,各种通讯协议的特点,优劣
  • HART(Highway Addressable Remote Transducer),可寻址远程传感器高速通道的开放通信协议,是美国Rosement 公司于1985年推出的一种用于现场智能仪表和控制室设备之间的通信协议. HART 装置提供具有相对低的带宽,适度响应时间的通信,经过10多年的发展, ...