组态王与单片机通信协议1
基于ASCII的单片机与组态王通讯设计
命令格式可查阅组态王使用手册。
2 通 信 流 程 图 1 组态 王从 单 片机 读 数 据 过 程 如 图 1所 示 。 )
字 头 HE AD: 1字节 1个 AS I , 0 Cl码 4 H
设备 地 址 : 节 2个 A CI , ~ 5 ( 0 0 0f 1字 S l 0 2 5 即 ~ xf 码 H)
标志: 1字 节 2个 AS l , i bi bt 0:读 , i =1: Cl码 bt 0~ t i 7, 0= bt 0
写 。 i : : 打包 。 i b 2 0 , bt O 不 1 bt i = 0 数据 类 型 为字 节 。 i bt = 1 3 t bt i 0 , 3 2 数据 类 型为 字 。bt bt = X 数 据 类 型为 浮 点 数 。 i i 1, 3 2
单 片 机的 串行 通 信 , 建 监 控 系 统 。 文 完 成 了组 态 王 与 单 片 机 构 本
通 讯 正 常 时下 位 单 片 机 应 答 格 式 为
HA ED 设 备 地 址 # # 蚌或 CR l ( 式 5 格 )
的通 讯 设 汁 , 方 法 设 汁简 单 且 实 时 性 好 , 用 于一 般 用 户 。 该 适 1 组 态 王 与 单 片机 的通 信 协 议
HE AD 设备 地址 标 志 数据 地 址 数据 字 节数 数 据 异 或 CR
通 讯 不 正常 时下 位 单 片机 应 答 为
J A J设备地址 j { HE D 异或 c J( 6) R 格式
其 中
和 舟} 不 同 的数 值 , }为 具体 组 态 王 与 单 片机 通 讯 的
异 或 :异 或 从 设 备 地址 到异 或 字 节前 ,异 或 值 转 换 成 2个
通用单片机通讯协议(ASCII)
1、在单片机中定义从地址0开始的数据类型为BYTE型的变量:
则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。。。。。。。。,数据类型为BYTE,每个变量占一个字节
2、在单片机中定义从地址100开始的数据类型为UINT型的变量:
则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。。。。。。。。,数据类型UINT,每个变量占两个字节
bit3bit2 =1x,数据类型为浮点数。
数据地址:2字节4个ASCII码,0x0000~0xffff
数据字节数:1字节2个ASCII码,1—100,实际读写的数据的字节数。
数据…:为实际的数据转换为ASCII码,个数为字节数乘2。
异或:异或从设备地址到异或字节前,异或值转换成2个ASCII码
CR:0x0d。
46
30
30
30
46
30
34
31
30
46
46
46
46
30
30
字头
设备地址15
标志
写操作
浮点型
打包
数据地址15
数据字节数4
数据65535
30
30
0d
异或
若正确:
40
30
46
23
23
37
36
0d
字头
设备地址15
##
异或
若不正确:
40
30
46
2a
2a
37
36
0d
字头
设备地址15
**
异或
5.浮点数格式:
4字节浮点数=第一字节高4位ASCII码+第一字节低4位ASCII码
单片机与组态王的通信实例
单片机与组态王的通信实例随着工业自动化的发展,越来越多的设备开始采用单片机进行控制。
而组态王作为一种通用的组态软件,可以方便地对单片机的控制过程进行监控和操作。
本文将介绍一个单片机与组态王通信的实例,以帮助读者了解二者的基本通信原理和实现方法。
一、单片机与组态王的通信方式单片机与组态王之间的通信一般采用串口通信方式。
串口通信是一种常见的通信方式,它通过串口数据线将单片机与计算机连接起来,实现数据传输。
在组态王中,可以通过设置串口参数来与单片机进行通信。
二、单片机通信协议在单片机与组态王通信的过程中,需要约定一些通信协议来实现数据的传输和控制。
通信协议一般包括数据格式、波特率、校验方式等。
根据不同的单片机和组态王版本,通信协议可能会有所不同,需要根据实际情况进行调整。
三、组态王通信控件的使用在组态王中,可以使用串口通信控件来实现单片机与组态王之间的通信。
控件提供了许多函数和属性,可以方便地进行串口通信。
例如,可以使用控件的Open函数打开串口,使用Read函数和Write函数进行数据的读取和写入。
四、实例:单片机控制LED灯亮灭下面是一个简单的单片机与组态王通信实例:通过单片机控制LED灯的亮灭。
该实例中使用的单片机型号为AT89C51,组态王版本为6.53。
1、硬件连接将AT89C51单片机的P1.0引脚连接到LED灯上,并将单片机的RXD 和TXD引脚分别连接到计算机的串口上。
2、编写程序在AT89C51单片机上编写程序,用于控制LED灯的亮灭。
程序如下:MOV P1.0, #1 //将P1.0引脚电平设为高电平,LED灯亮SJMP $ //无限循环,保持电平不变3、组态王组态设计在组态王中创建一个新项目,并添加一个设备,选择与AT89C51单片机进行通信的串口设备。
然后创建一个画面,添加一个按钮和指示灯,用于控制LED灯的亮灭。
4、编写组态王脚本程序在组态王中编写脚本来实现与单片机的通信。
脚本如下:Dim ledState As Integer //定义LED状态变量,初始值为0 Function OnClick() As Integer //按钮单击事件处理函数If ledState = 0 Then //如果LED状态为灭,则发送高电平信号,使LED亮起CommandManager.WriteTag("TagName", "1") //写入高电平信号ledState = 1 //修改LED状态为亮Else //如果LED状态为亮,则发送低电平信号,使LED熄灭CommandManager.WriteTag("TagName", "0") //写入低电平信号ledState = 0 //修改LED状态为灭End IfEnd Function5、调试与运行将程序编译并下载到AT89C51单片机中,然后运行组态王程序。
单片机与组态王软件通讯的解决方案
单片机与组态王软件通讯的解决方案
1、引言
组态王软件作为一种工业控制组态软件在国内已得到了非常广泛的应用。
其具有强大的硬件支持能力,对国内外绝大多数PLC、变频器、板卡、模块、仪器仪表都编写了相应的驱动程序,使用起来相当方便快捷。
在农水实验田环境监测项目中,我们使用的硬件设备包括日本三菱PLC、台湾研华亚当模块及自行开发的基于单片机的分析仪器,我们选择的软件开发平台是组态王软件。
因此,实现单片机与组态王的数据通讯是一个必须解决的问题。
2、单片机与组态王软件通讯的解决方案
2.1 两种通讯解决方案
单片机与组态王软件通讯的解决方案有两种,其一是直接编写支持单片机的驱动程序,就象组态王支持PLC 一样;其二是利用组态王软件和Visual Basic 都支持DDE 的特点,以VB 为开发平台,写一个数据通讯应用程序,一方面
实现与单片机的连接,另一方面实现与组态王的动态数据交换。
2.2 两种方案的比较
第一种方案的优点是程序结构比较紧凑,数据通讯效率较高;缺点是必须由对组态王软件内核比较清楚的程序员开发,开发周期较长。
第二种方案可由一般的程序员开发,缺点是数据通讯效率较低。
在本项目中,我们采用了第二种方案。
3、基于DDE 方案的实现
3.1 DDE 的概念
DDE 是WINDOWS 平台上的一个完整通信协议,它使应用程序能彼此交换数据和发送指令。
DDE 过程可以比喻为两人对话,一方向另一方提出问题,然。
单片机与组态王基于ASCII型通讯程序设计
单片机与组态王基于 A CI S 型通讯程序设计 l
Co m u ia in P o r m b t e CU a d ig e B s d o m nc t r g a o e we n M n K n Viw a e n ASCI r o o s t c l I p o
# e ie E d 0 0 / d f n x d 定 义字 尾 C 一个 A CJ / n R, S I . # e ie e d o o / d f R a x o 上 位机 读 n /
#d fn W re x e ie i O O1 t / 上 位 机 写 /
u h r n we 【] 1x 0O 3 ,x 000000 0 } c a A s r8 = 0 4 ,x 00 3 ,,,.,x d ;
应答 信 息 帧 数 组 / u h rc u t O / c a o n= . 接 收 字 头字 尾 间 数 据 个 数 t / u h rf g 0 c a l = ; / 单 片 机 接 收 到字 头 标 志 a /
Ths i pap ito ce t e er n rdu s h ASCI omm u c i p ooc l bewe KigVi I c niat on r t os t en n ew an MCU, d d an prvi s o de al C pr a l ogrm s ure o c co of m pl de i eme of o muncain nt c m i t pr o ol I ont o otc s. d ne d o ta h t e t at c an f clisdi t us t e y a it r l ie ec y e h ASCI r t o I ooc l p
组态王通用单片机协议(ASCII)说明
组态王通用单片机协议(ASCII)说明概述通用单片机ASCII协议支持单片机与组态王通讯,用户只要按照我们的协议编写单片机通讯程序就可实现与组态王的通讯.组态王设置1、定义组态王设备定义组态王定义设备时请选择:智能模块\单片机\通用单片机ASCII\串口组态王的设备地址定义格式:##.#前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,"0"为不打包、"1"为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作,与单片机的程序无关.2、组态王通讯通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致3.组态王数据词典--变量定义在组态王中定义的寄存器数据格式(类型):由单片机决定。
斜体字dd代表数据地址,此地址与单片机的数据地址相对应.注意:在组态王中定义变量时,一个X寄存器根据所选数据类型(BYTE,USHORT,FLOAT)的不同,分别占用一个、两个,四个字节,定义不同的数据类型要注意寄存器后面的地址,同一数据区内不可交叉定义不同数据类型的变量。
为提高通讯速度建议用户使用连续的数据区。
例如,1、在单片机中定义从地址0开始的数据类型为BYTE型的变量: 则在组态王中定义相应的变量的寄存器为X0、X1、X2、X3、X4。
,数据类型为BYTE,每个变量占一个字节2、在单片机中定义从地址100开始的数据类型为USHORT型的变量: 则在组态王中定义相应的变量的寄存器为X100、X102、X104、X106、X108。
数据类型USHORT,每个变量占两个字节3、在单片机中定义从地址200开始的数据类型为FLOAT型的变量: 则在组态王中定义相应的变量的寄存器为X200、X204、X208、X212。
组态王及单片机多机串口通信的设计
组态王与单片机多机串口通信的设计1 引言随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。
现在组态软件繁多,比如KingVieW(组态王)、MCGS、WinCC等。
KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。
由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。
现在组态软件繁多,比如KingVieW(组态王)、MCGS、WinCC等。
KingView软件基于Microsoft Windows XP,NT/2000操作系统.具有友好的人机操作界面、强大的IO设备端口驱动能力,可与各种PLC、智能仪表、智能模块、板卡、变频器等实时通讯。
由于在检测大量模拟量的工业现场使用PLC与组态软件通讯势必增加产品成本。
而单片机接口丰富,与A/D转换模块组合可以完成相同的工作,并且系统可靠、成本低。
2 组态王与单片机的串口通讯方法目前,组态王与单片机的通信多是通过动态数据交换(DDE)或通过自己开发通讯驱动程序完成。
DDE是Windows平台上的一个完整的通信协议,组态王通过该协议与其他应用程序交换数据。
但不可靠和非实时。
而自己开发通讯驱动程序会带来设计困难,增加系统开发周期,可行性不高。
组态王专门提供一种与单片机多机串口通信方法,可满足大多数系统需求。
3 PC机与单片机的硬件接口电路图1为上位PC机与下位单片机80C51的连接电路。
PC机与单片机本身都自带串行通讯接口,但由于在分布式系统中PC机与各单片机的分布不集中,不能利用RS-232通讯传输,只能改用RS-485。
RS-485采用差分式传输信号,最大传输距离为1 219 m.最大传输速率为10 Mb/s.对同时出现的两条信号线A、B 的干扰有较强的抑制能力。
单片机与组态王的通信
组态王(kingView)内置了通用单片机通信模块,这样,我们自己开发的单片机仪表就可以挂接在KingView上了。
因为这样,所以对这个东西有了些兴趣,做了些研究。
(1)研究环境组态王6.53,免费下载,当然有使用限制,不过用于研究是没有问题的。
下载地址:/download/index.aspxKeil软件,Porteus,这些就不多说了。
Virtual Serial Ports Driver XP 5.1 虚拟串口软件,用此软件可以生成一对相互联接的虚拟串口,这样,初期的研究工作就在电脑上完成了,省得用硬件电路板了。
(2)资料KingView提供了一份简单的说明材料,就在下载后的解压缩文件包中。
具体的位置是:Value Pack\技术资料\常用协议\单片机ASCII码通讯协议(3)电路搭建注意单片机的TXD与虚拟串口的TXD,单片机的RXD与虚拟串口的RXD是连在一起的,不要交叉哦,我在这上面可吃了不少的苦头。
这个虚拟串口元件的设置如下图所示:说明:这里选COM2,是因为我事先用Vspd生成了一对虚拟串口,com2和com4,至于其他参数则应该选得和kingview中的一致,这个到下面再说。
什么,这个元件不知哪里找?这里啦(4)VSPD的使用现如今的电脑很少有两个串口的了,人呢也是越来越懒了,虽然手边的电路板是现成的,写片子是容易的,但是仍然还是嫌麻烦的,所以就发动狗狗搜一搜,找到了这个VSPD,当然它是很容易用的在first后面选一个串口名,然后在Second后面再选一个串口名,然后点一下Add Pair 就行啦。
怎么选都可以,就算是选com1也是可以的,虽然com1是真实存在的物理串口,但是这个VSPD照样把它给虚拟了。
这里我选的是com2和com4,大家可以看到在左侧的窗口中出现了这样一对互联的串口了,也就是说,我从串口2发数据,然后串口4就能收到。
同样,我从串口4发数据,串口2就能收到。
组态王6[1].5与单片机的通信方法
&h
II
T 222222 a .+J. (5Q,*9.*.(K.LEAEM"NGG"X&!R I I 读数据请求 T 222222 a .+J. (5Q,*9.*.(K.LEAEM"NGG"X&%R I I 写数据请求 T 222222 a I P 发送数据 P I (5Q,*O.)->,DR T U<G"H 9<G"H :OG"H *0*G"H 5C0Q(G"H(/,*O.)->,DH(__R T OV?FG,*O.)-LEAEM(NH \3(+.QU<GG"R H U<G"H *0*eG,*O.)-LEAEM(NH a OV?FG"X"fH I I 发送 :U8 \3(+.QU<GG"R H U<G"H *0*eG"X"fH 发送校验位 OV?FG*0*H II \3(+.QU<GG"R H U<G"H a a I P 初始化串口 P I KC(- ()(Ab,E0AQKC(-R T 222222 a KC(- DE()QKC(-R T ()(Ab,E0AQRH \3(+.Q$R T :OG$H E)J\.0b*D-QRH a a
!
结束语 组态王软件与单片机可以组合成一套经济可靠的数据采
集, 存储系统, 而且可以方便地接入以太网。实践证明这种系统 不但可靠、 实用、 经济, 而且便于设计, 易于扩充, 具有较高的推 广价值。 参考文献
$
北京亚控科技发展有限 公 司 2 组 态 王 g()1 =(.\ =.0J(C) ^2& 使 用 手册, !""f [收稿日期: !""#2&2!! ]
组态王与单片机通信实例
* 组态协议: 字头设备地址标志数据地址数据字节数数据… 异或CR* 字头: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 码* //如得0x4b,对应Ascll为0x34和0x42.* CR:0x0d。
*/////////// 读格式为:字头设备地址标志数据地址数据字节数异或 CR// 写格式: 字头设备地址标志数据地址数据字节数数据… 异或 CR#include "reg52.h"#define uchar unsigned char#define CTH0 0xfe#define CTL0 0x0csbit led1=P2^7;//定义LED.sbit led2=P2^6;sbit led3=P2^5;sbit led4=P2^4;//unsigned char i10=0; //收数据标//unsigned int j=0; //动态显示数据用unsigned char i=0; //动态显示用int j=0; ////调试用unsigned char k=0; ////调试用1~100.//unsigned char k4=0; //K4为发送的数据 ;K6为组态下传数据标志。
组态王与单片机的通信
组态王与单片机的通信与设计前言本文主要是解决装有组态王的PC机与单片机的通信问题,这里选择通过计算机的COM1口进行串行通信。
单片机和PC机的串行通行一般采用RS-232、RS-422或RS-485总线标准接口,也有采用非标准的20mA电流环的。
为保证通信的可靠,在选择接口时必须注意:(1)通信的速率;(2)通信距离:(3)抗干扰能力;(4)组网方式,既可以保证正常通信时的最大通信端口数量。
这里采用RS-232接口与单片机通信的方法。
由于两者间的电平规范不一致,实现两者间的通信要解决接口电路的电平转换问题。
正文选题背景随着单片机和微机技术的不断发展,单片机的应用也从独立的单机向网络发展,由PC机和多台单片机构成的多级网络测控系统已成为单片机技术发展的一个方向。
在一个大型的应用系统中,通常由单片机完成数据的采集和上传,后台则通过PC机对数据进行分析并处理,复杂的还要建立数据库形成网络,二者的结合,充分发挥了单片机在实时数据采集和微机对图形处理、显示以及数据库管理上的优点,使得单片机的应用已不仅仅局限于传统意义上的自动监测或控制,而形成了向以网络为核心的分布式多点系统发展的趋势。
随着微电子技术、计算机控制技术、工业以太网技术及现场总线技术的发展,作为用户无需改变运行程序原代码的软件平台工具——工控组态软件日渐成熟。
由于工控组态软件在实现工业控制的过程中免去了大量烦琐的编程工作,解决了长期以来控制工程人员缺乏计算机专业知识与计算机专业人员缺乏控制操作技术和经验的矛盾,极大地提高了自动化工程的工作效率。
近年来,工控组态软件在中小型工业过程控制工程、工业自动化工程中越来越受到欢迎。
不仅如此,工控组态软件还在配电自动化、智能楼宇、农业自动化、能源监测等领域也逐步展示了其独特的优势。
单片机控制系统以其高性能价格比、稳定、易于实现等特点而被广泛使用,但他难以实现动态复杂的图形监控界面;而组态王软件具有强大丰富的监控界面设计功能,却难以实现复杂的控制算法,而单片机则难以实现动态复杂的图形监控界面,若采用以单片机为下位机,以装有组态王的PC极为上位机的控制方式,将彻底改变原来单片机控制系统的单调、简单的控制界面的缺陷,进一步推动单片机控制方式的广泛应用。
组态王软件与单片机串口ascii通讯的机制及实现方法
组态王软件与单片机串口ascii通讯的机制及实现方法作者:姜宝申组态软件广泛的应用于工农业生产的各个领域,是保证相关系统设备经济稳定安全运行的重要方式,是对传统控制方式的一次革命,得到了越来越广泛的应用。
很多工控及电子爱好者对这方面很感兴趣,都跃跃欲试,可苦于软件要想得到实际效果,就得连接设备,通过设备预设的寄存器与软件的变量进行连接,辅以命令语言,才能取得真正的体验。
软件支持的设备比如板卡、数字仪表、PLC、变频器等等都是属于工控设备,价格都比较昂贵,一般很难触及。
那是不是组态软件就不适合于我们用了呢,也不一定,比如国产的组态王组态软件支持单片机串口ascii 通讯,烧写了相应程序的单片机也可以当做组态软件的设备,和其他设备一样,也能完成诸如水位、行程等状态的监视及电机、阀门、灯泡、加热器等的启动停止,开与关,以及模拟量经AD转换后,通过串口以ascii码的形式传送给组态软件,只是这些功能的实现是依靠单片机的端口来完成,组态软件访问单片机,监视单片机所有端口状态,控制一部分端口的高低电平状态,辅以外部电气回路,同样能实现相应的功能。
例如:组态软件通过串口发送指令,控制单片机的某个输出端口的电平高低变化,端口通过驱动使继电器的触点闭合,电机转动,假如这个电机是带动水泵往水箱里面打水,水箱水位的预定位置装有触点,这个触点连接在单片机的另一个输入端口上,当水位到达触点位置,触点动作单片机的这个端口电平发生变化,这个变化通过同一个串口传回给组态软件,组态软件可以根据命令语言编写的程序酌情是自动还是手动停止电机运行,或者是调整电机的转速,保证水箱的水位在预设的范围内,这就是组态软件构成的控制系统的最基本应用。
图1相对而言,用单片机与组态软件实现的控制系统要比其他成品设备的组态稍微麻烦一些,不但需要了解掌握组态软件的工作机制,还需要单片机的软硬件及电路方面的知识,这里边的重点就是单片机的汇编或c语言编程,但掌握了组态软件的通讯协议,按协议编写,比较起来并不是很难。
浅谈组态王6.55与单片机的应用及通讯
浅谈组态王6.55与单片机的应用及通讯摘要:本文详细介绍了组态王6.55与51单片机各自特点及结合在一起应用的优点,简单介绍组态王6.55与51单片机直接通信的参数说明。
这种组态王6.55与51单片机的通信方法简单、快速、可靠,并在工业自动化方面得到广泛的应用。
关键词:组态王6.55,51单片机,通信Abstract:This paper introduces in detail the Kingview 6.55 and their respective characteristics of the 51 microcontroller and combining the advantages in application of the parameters together, introduces Kingview 6.55 and 51 SCM direct communication. This communication method between Kingview 6.55 and 51 SCM is simple, fast and reliable, and has been widely used in industrial automation.Keyword: Kingview6.55,51 SCM,communication单片机具有强大的数据处理能力、控制功能强、价格低廉、可靠性高、功耗小的特点,应用领域非常广泛,是计算机自动化控制中最为流行的一种控制机型,目前的应用领域有:(1)工业自动化:机械、电子、电力、石油、化工、纺织、食品等领域,无论过程控制、数据采集与测控技术、生产线上的机器人,都离不开单片机;(2) 信息和通信产品:计算机外设、办公自动化设备;(3)家用电器:智能化;(4) 仪器仪表:数字化、智能化、多功能化、柔性化,单片机使精度提高、结构简化、体积减轻、携带方便,并增加了显示、报警和自诊断功能;(5) 军事装备:单片机也渗入其中随着工业自动化进程的不断加快,现场仪器、仪表、设备正不断向数字化、智能化及网络化方向推进,北京亚控科技发展有限公司的Kingview6.55工控组态软件以其工作性能稳定可靠、友好的人机界面、配置硬件方便以及易学易用,同时其驱动程序较为丰富(多达500多种的设备、3000多种驱动),如支持DDE、板卡、OPC、市面上使用的大部分PLC、智能仪表、智能模块等;支持Windows通用的ActiveX控件、SQL数据库访问、配方管理应用、网络功能(B/S结构的网络发布)、冗余功能(即双设备冗余、双机热备和双网络冗余)。
组态王与单片机通讯
166 //打包字读
#define TYPEWritw
85 //字节写
#define TYPEWritw2
87 //打包字写
#define TYPEReadF
168 //双字读
#define TYPEReadF2
170 //打包双字读
#define TYPEWritF
组态王与单片机通讯
与组态王通讯时请注意选择的单片机晶震频率和波特率及效验否则无法通讯成功
本次测试组态王只支持 19200 波特率,再高的波特率没有成功,不知道是何原因难道组态的原因吗?
************************************************************************************************************/
//xdata uint x2 _at_ 0x2000; //在 xdata 区中定义字变量 x2,它的地址为 0x2000H,这里是 uint
//unsigned int xdata dat[10]={1,7,3,4,5,6,7,8,9,10}; unsigned char xdata datBYTE[3]={ 5,
6, 7,
}; unsigned int xdata datWORD[10]; unsigned long xdata datFOALT[10];
unsigned char recbuf[22]={ 0x40, //字头---------组态王向单片机回读写的数据 0x30, //设备地址 2 0x31, //设备地址 1 0x30, //标志 11111111 B(000001100) 0x31, //标志 bit0= 0:读,bit0= 1:写 bit1= 0:不打包。 0, //数据地址 0, //数据地址 0, //数据地址 0, //数据地址 0, //数据字节数 0, //数据字节数 0, //数据 0, //数据 0, //数据 CR 结束符号读写数据类型为字节为 14 个数据 0, //数据 0, //异或 0, //异或 0x0d, //CR 结束符号读写数据类型为字为 18 个数据 0, 0x0d, //CR 结束符号读写数据类型为浮点型为 20 个数据 0,
单片机通信协议
单片机通信协议单片机通信协议是指单片机与外部设备或其他单片机之间进行通信所遵循的规则和约定。
在实际的单片机应用中,通信协议的选择和设计对系统的稳定性和可靠性有着重要的影响。
本文将介绍单片机通信协议的基本概念、常见的通信协议类型以及在实际应用中的一些注意事项。
首先,我们来了解一下单片机通信协议的基本概念。
单片机通信协议是指单片机与外部设备或其他单片机之间进行数据交换时所遵循的规则和约定。
这些规则和约定包括数据传输的格式、时序、速率、校验方式等。
通信协议的设计需要考虑到通信的稳定性、实时性、数据完整性以及系统的复杂程度等因素。
常见的单片机通信协议包括串行通信协议(如UART、SPI、I2C等)和并行通信协议等。
其次,我们将重点介绍串行通信协议。
串行通信协议是指通过单根传输线路进行数据传输的通信方式。
其中,UART(Universal AsynchronousReceiver/Transmitter)是一种异步串行通信协议,常用于单片机与外部设备(如传感器、显示器、通信模块等)之间的数据传输。
UART通信采用一对传输线(TXD 和RXD)进行数据的发送和接收,通过波特率的设置来控制数据传输的速率。
SPI (Serial Peripheral Interface)和I2C(Inter-Integrated Circuit)是另外两种常见的串行通信协议,它们分别适用于单片机与外部设备之间的高速数据传输和多设备之间的通信。
在实际应用中,设计单片机通信协议需要考虑到多方面的因素。
首先,需要根据系统的实际需求选择合适的通信协议类型,考虑到通信距离、数据传输速率、系统成本等因素。
其次,需要合理设计数据传输的格式和时序,确保数据的准确传输和接收。
此外,还需要考虑到通信的实时性和稳定性,避免数据丢失、错误或冲突。
最后,需要对通信协议进行充分的测试和验证,确保系统的稳定性和可靠性。
总之,单片机通信协议在单片机系统设计中起着至关重要的作用。
单片机通信协议
单片机通信协议单片机通信协议是连接具有不同硬件和软件构成的电子设备之间的约定,是单片机系统中可靠的指令传输技术。
它可以让多个设备的不同厂家的不同型号的芯片共同运行,实现多机协同功能,实现多机交互数据传输。
近年来,随着单片机技术的普及,单片机通信协议的重要性也逐步受到重视。
本文主要介绍单片机通信协议的特点和详细过程,以及实现协议的不同技术。
1、单片机通信协议的特点单片机通信协议主要体现在以下几点:(1)标准化。
单片机通信协议是一种国际通用的标准,有利于不同厂家的不同型号的芯片之间进行高效的通信。
2)可靠性高。
单片机通信协议可以很好地保证传输数据的完整性和准确性,保障数据传输过程中不会出现错误和丢失。
(3)简单易懂。
单片机通信协议可以很容易的被大多数的程序员接受,使用更简单易懂的注释和编程模板,可以简化程序的编写,提高程序的可操作性。
2、单片机通信协议的详细过程单片机通信协议的详细过程可以分为以下四个步骤:(1)设定通信参数。
首先根据不同的通信场景,分析两个芯片之间的通信要求,设定好协议标准,包括串口号、波特率、数据长度等通信参数。
(2)建立数据链路。
建立数据链路时,应当使用可靠的连接模式,使两个芯片之间的通信更为可靠。
(3)数据传输。
在建立数据链路后,可以开始传输数据,包括发送端和接收端各自发送和接收不同指令和数据,在一次通信中完成系统运转。
(4)断开连接。
在数据传输完成后,应当及时断开连接,确保不会有其他人劫持或者更改数据。
3、单片机通信协议的实现技术单片机通信协议的实现技术包括以下几种:(1)串口通信。
串口通信的原理是通过一根线将串口两端的芯片连接,通过不断的发送和接收信号来实现数据的传输。
(2)并行通信。
通过将多个线同时连接,可以同时传输大量的数据,从而提高传输速度。
(3)无线通信。
无线通信可以实现远距离的传输,使芯片之间可以在任何地方进行通信。
4、结论综上所述,单片机通信协议是连接不同设备之间的约定,可以实现多机协同功能,有利于具有不同硬件和软件构成的电子设备之间进行高效可靠的通信。
组态王与单片机通信协议1
一、通讯参数:通讯参数包括数据位,停止位,波特率、校验方式。
数据位、停止位、波特率由单片机决定。
组态王中的设定和单片机一致即可。
校验方式参照“数据传输格式”中相关部分。
二、数据传输格式:格式1、组态王发送地址请求格式:(此时检验位为1)ENQ Sta EOT CRC格式2、单片机应答地址格式:(此时检验位为0)ACK Sta ETX CRC格式3、组态王读数据请求格式:(此时检验位为0)ENQ R DataType DataAddr DataNum EOT CRC格式4、单片机应答读数据格式(正确):(此时检验位为0)ACK DataLong Data….ETX CRC格式5、单片机应答读数据格式(错误):(此时检验位为0)NAK ErrorCode ETX CRC格式6、组态王写数据请求格式:(此时检验位为0)ENQ W DataType DataAddrData….EOT CRC格式7、单片机应答写数据格式(正确):(此时检验位为0)ACK ErrorCode ETX CRC三、时序:读数据:组态王单片机第一步:格式1第二步:格式2第三步:格式3第四步:格式4或格式5 第五步:如果第四步单片机执行格式4,结束。
否则,执行格式1。
第六步:格式2第七步:格式3第八步:格式4或格式5写数据:组态王单片机第一步:格式1第二步:格式2第三步:格式6第四步:格式7第五步:如果第四步单片机执行格式7的ErrorCode=0,结束。
否则,执行格式1。
第六步:格式2第七步:格式6第八步:格式7四、协议说明:数据传输:所有数据均为16进制数ENQ(头) H05 询问请求帧的开始代码ACK(头) H06 确认ACK应答帧的开始代码NAK(头) H15 否认NAK应答帧的开始代码EOT(尾) H04 正文的结束请求帧的结束ASCII代码ETX(尾) H03 结束正文应答帧的结束ASCII代码Sta::设备地址1字节R:读标志1字节(0x52)W:写标志1字节(0x57)DataType;需要交换的数据类型,1字节。
单片机通信协议
单片机通信协议
单片机通信协议是一种由多种电子设备共同组成的物理层面的数据交换协议。
它使用特定的编码标准来自动传输数据,这种编码技术被称为SPIM(Serial Peripheral Interface Module)。
单片机通信协议的主要目的是提供一种使多台设备之间的无缝通信和接收和发送数据的方法。
此外,它还能支持多种类型的传感器和外围设备,如计算机,打印机和存储设备。
单片机通信协议实现了两个多功能组件——传输控制和数据传输单元,它们与一台服务器(发送单元)相连接。
传输控制协议(TCP)负责指导数据传输,允许单片机连接到特定服务器,控制传输速率以及保证发送的数据的正确性和完整性。
数据传输单元(DTE)负责实际的数据传输,使用特定的SPIM编码传输数据。
传统的单片机通信协议支持两种不同的可靠性通信——半双工和全双工。
半双工协议是一种简单易用的通信协议,它使得单片机可以发送和接收数据,但只能在一个时间点发送或接收。
全双工协议允许单片机同时发送和接收数据,但需要更多的传输带宽。
单片机通信协议的使用可以大大提高电子设备的可靠性、效率和可维护性。
它允许多台设备之间的高速通信,保证数据的准确性,可以连接传感器设备和外围设备,使用户能够更快地收集和传输数据。
然而,由于它只支持特定的传输编码,当与外部接口不兼容时,单片机通信协议会导致设备运行效率受到抑制,可能会失去更多数据。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、通讯参数:通讯参数包括数据位,停止位,波特率、校验方式。
数据位、停止位、波特率由单片机决定。
组态王中的设定和单片机一致即可。
校验方式参照“数据传输格式”中相关部分。
二、数据传输格式:格式1、组态王发送地址请求格式:(此时检验位为1)ENQ Sta EOT CRC格式2、单片机应答地址格式:(此时检验位为0)ACK Sta ETX CRC格式3、组态王读数据请求格式:(此时检验位为0)ENQ R DataType DataAddr DataNum EOT CRC格式4、单片机应答读数据格式(正确):(此时检验位为0)ACK DataLong Data….ETX CRC格式5、单片机应答读数据格式(错误):(此时检验位为0)NAK ErrorCode ETX CRC格式6、组态王写数据请求格式:(此时检验位为0)ENQ W DataType DataAddrData….EOT CRC格式7、单片机应答写数据格式(正确):(此时检验位为0)ACK ErrorCode ETX CRC三、时序:读数据:组态王单片机第一步:格式1第二步:格式2第三步:格式3第四步:格式4或格式5 第五步:如果第四步单片机执行格式4,结束。
否则,执行格式1。
第六步:格式2第七步:格式3第八步:格式4或格式5写数据:组态王单片机第一步:格式1第二步:格式2第三步:格式6第四步:格式7第五步:如果第四步单片机执行格式7的ErrorCode=0,结束。
否则,执行格式1。
第六步:格式2第七步:格式6第八步:格式7四、协议说明:数据传输:所有数据均为16进制数ENQ(头) H05 询问请求帧的开始代码ACK(头) H06 确认ACK应答帧的开始代码NAK(头) H15 否认NAK应答帧的开始代码EOT(尾) H04 正文的结束请求帧的结束ASCII代码ETX(尾) H03 结束正文应答帧的结束ASCII代码Sta::设备地址1字节R:读标志1字节(0x52)W:写标志1字节(0x57)DataType;需要交换的数据类型,1字节。
1,字节;2,字,3,浮点型。
DataType的值含义1 字节2 字3 浮点数DataNum:要读取的数据的数量,1字节。
DataAddr;为数据偏移地址2字节,低字节在前,高字节在后Data:实际传输的数据,低字节在前,高字节在后DataLong: 单片机返回Data的字节数,2字节,低字节在前,高字节在后CRC:为从第一个字节至CRC前的所有字节的异或值,1字节ErrorCode:ErrorCode数值含义0 正确应答1 数据类型错误2 数据范围超限3 指令无法识别,应为R或W。
4 校验错误1.通讯口设置:通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
字节数据格式:由单片机决定。
起始位数据位校验位停止位注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致2.在组态王中定义设备地址的格式格式:##.#前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。
3.在组态王中定义的寄存器格式寄存器名称dd上限dd下限数据类型X dd65535 0 FLOAT/BYTE/UINT斜体字dd代表数据地址,此地址与单片机的数据地址相对应。
注意:在组态王中定义变量时,一个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.组态王与单片机通讯的命令格式:读写格式(除字头、字尾外所有字节均为ASCII码)字头设备地址标志数据地址数据字节数数据…异或CR说明;字头: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数据3.1.上位机发送读命令字头设备地址标志数据地址数据字节数异或CR下位机应答:若正常:字头设备地址数据字节数数据…异或CR若不正常:字头设备地址** 异或CR例1:读15号仪表,数据地址为15的数据。
其中数据为100,数据类型为字节,不打包。
组态王所发数据为:40 30 46 43 30 30 30 30 46 30 31 37 32 0d字头设备地址15 标志数据地址15 数据字节数1异或读操作字节型不打包若正确:40 30 46 30 31 36 34 37 35 0d字头设备地址15 数据字节数1数据100 异或若不正确:40 30 46 2a 2a 37 36 0d字头设备地址15** 异或例2:读15号仪表,数据地址为15的数据。
其中数据为100,数据类型为字节,打包。
组态王所发数据为:40 30 46 43 32 30 30 30 46 30 31 37 30 0d字头设备地址15标志读操作字节型打包数据地址15 数据字节数1异或若正确:40 30 46 30 31 36 34 37 35 0d字头设备地址15 数据字节数1数据100 异或若不正确:40 30 46 2a 2a 37 36 0d设备地址15** 异或3.2.上位机发送写命令字头设备地址标志数据地址数据字节数数据…异或CR 下位机应答:若正常:字头设备地址## 异或CR若不正常:字头设备地址** 异或CR例1:写15号仪表,数据地址为15。
写数据255,数据类型为字,不打包。
组态王所发数据为:40 30 46 43 35 30 30 30 46 30 32 30 30 46 46 37 34 0d字头设备地址15标志写操作字型不打包数据地址15 数据字节数2数据255 异或若正确:40 30 46 23 23 37 36 0d字头设备地址15## 异或若不正确:40 30 46 2a 2a 37 36 0d字头设备地址15** 异或例2:写15号仪表,数据地址为15。
写数据65535,数据类型为浮点型,打包。
组态王所发数据为:40 30 46 43 46 30 30 30 46 30 34 31 30 46 46 46 46 30 30字头设备地址15标志写操作浮点型打包数据地址15 数据字节数4数据6553530 30 0d 异或若正确:40 30 46 23 23 37 36 0d## 异或字头设备地址15若不正确:40 30 46 2a 2a 37 36 0d 字头设备地址** 异或153、注:仪表内部数据为十六进制表示的十进制数。
如:实时测量值为500,则用十六进制表示为1F4H。
仪表通讯传输是将上述十六进制数据转化为标准ASCII 码(即一字节的16进制数转化为2个ASCII码──高4位ASCII码+低4位ASCII 码)。
如:上述数据1F4H(16进制),传输时,转化为ASCII码则为30H、31H、46H、34H。
此浮点数格式的转换:1)ASCII码到浮点数: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] < 0x47))Hd[7] = ((c[7] - 0x37) & 0x0f);else if((c[7] > 0x60) && (c[7] < 0x67))Hd[7] = ((c[7] - 0x57) & 0x0f);elseHd[7] = ((c[7] - 0x30) & 0x0f);if((c[6] > 0x40) && (c[6] < 0x47))Hd[6] = ((c[6] - 0x37) & 0x0f);else if((c[6] > 0x60) && (c[6] < 0x67))Hd[6] = ((c[6] - 0x57) & 0x0f);elseHd[6] = ((c[6] - 0x30) & 0x0f);DTc[2] = (float)(((float)(Hd[6] * 16.0) + (float)(Hd[7])) / 256.0);if((c[5] > 0x40) && (c[5] < 0x47))Hd[5] = ((c[5] - 0x37) & 0x0f);else if((c[5] > 0x60) && (c[5] < 0x67))Hd[5] = ((c[5] - 0x57) & 0x0f);elseHd[5] = ((c[5] - 0x30) & 0x0f);if((c[4] > 0x40) && (c[4] < 0x47))Hd[4] = ((c[4] - 0x37) & 0x0f);else if((c[4] > 0x60) && (c[4] < 0x67))Hd[4] = ((c[4] - 0x57) & 0x0f);elseHd[4] = ((c[4] - 0x30) & 0x0f);DTc[1] = (float)((((float)(Hd[4] * 16.0) + (float)Hd[5]) + DTc[2]) / 256.0);if((c[3] > 0x40) && (c[3] < 0x47))Hd[3] = ((c[3] - 0x37) & 0x0f);else if((c[3] > 0x60) && (c[3] < 0x67))Hd[3] = ((c[3] - 0x57) & 0x0f);elseHd[3] = ((c[3] - 0x30) & 0x0f);if((c[2] > 0x40) && (c[2] < 0x47))Hd[2] = ((c[2] - 0x37) & 0x0f);else if((c[2] > 0x60) && (c[2] < 0x67))Hd[2] = ((c[2] - 0x57) & 0x0f);elseHd[2] = ((c[2] - 0x30) & 0x0f);Decimal = (float)(((float)(Hd[2] * 16) + (float)(Hd[3]) + DTc[1])/ 256.0);if((c[1] > 0x40) && (c[1] < 0x47))Jiema[1] = ((c[1] - 0x37) & 0x0f);else if((c[1] > 0x60) && (c[1] < 0x67))Jiema[1] = ((c[1] - 0x57) & 0x0f);elseJiema[1] = ((c[1] - 0x30) & 0x0f);if((c[0] > 0x40) && (c[0] < 0x47))Jiema[0] = ((c[0] - 0x37) & 0x0f);else if((c[0] > 0x60) && (c[0] < 0x67))Jiema[0] = ((c[0] - 0x57) & 0x0f);elseJiema[0] = ((c[0] - 0x30) & 0x0f);ShuFU = ((Jiema[0] & 0x08) >> 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;elsereturnflo = (float)pow(2, Jiema[2]) * Decimal;if(ShuFU)returnflo = (-1) * returnflo;return returnflo;}2)浮点数到ASCII码: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 < 8; j++)c[j] = 0x30;return;}if(d < 0){ShuFu = TRUE;d = (-1) * d;}while(d > 1){d =(float)(d / 2.0);i ++;}while(d <= 0.5){JieFu = TRUE;d = (float)(d * 2.0);i ++;}if(d == 1){for(int j = 2; j < 8; j++)c[j] = 0x46;}else{inbyte2 = (int)(d * 256);F_afterbyte2 = (d * 256) - (int)(d * 256);inbyte3 = (int)(F_afterbyte2 * 256);F_afterbyte3 = (F_afterbyte2 * 256) - (int)(F_afterbyte2 * 256);inbyte4 = (int)(F_afterbyte3 * 256);F_afterbyte4 = (F_afterbyte3 * 256) - (int)(F_afterbyte3 * 256);itoa(inbyte2, afterbyte2, 16);itoa(inbyte3, afterbyte3, 16);itoa(inbyte4, afterbyte4, 16);if(inbyte2 == 0){c[2] = 0x30;c[3] = 0x30;}else if(inbyte2 < 16){c[2] = 0x30;c[3] = afterbyte2[0];}else{c[2] = afterbyte2[0];c[3] = afterbyte2[1];}if(inbyte3 == 0){c[4] = 0x30;c[5] = 0x30;}else if(inbyte3 < 16){c[4] = 0x30;c[5] = afterbyte3[0];}else{c[4] = afterbyte3[0];c[5] = afterbyte3[1];}if(inbyte4 == 0){c[6] = 0x30;c[7] = 0x30;}else if(inbyte4 < 16){c[6] = 0x30;c[7] = afterbyte4[0];}else{c[6] = afterbyte4[0];c[7] = afterbyte4[1];}}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 < 16){c[0] = 0x30;c[1] = inbyte1[0];}else{c[0] = inbyte1[0];c[1] = inbyte1[1];}for(i = 0; i < 8; i ++){if((c[i] > 0x60) && (c[i] < 0x67))c[i] = c[i] - 0x20;}c[8] = 0x00;}。