组态王上位机与单片机通信协议
- 格式:doc
- 大小:228.00 KB
- 文档页数:18
合同制定方法单片机与上位机通信协议的制定合同制定方法:单片机与上位机通信协议的制定一、引言在现代科技的发展中,单片机与上位机通信的需求越来越多。
单片机作为一种集成电路,具有计算、控制和存储等功能,而上位机则提供更强大的计算和存储能力。
两者的结合可以实现更复杂的控制和数据处理任务。
然而,在单片机与上位机通信过程中,需要制定一种通信协议,确保双方的信息交换能够顺利进行。
本文将介绍合同制定方法:单片机与上位机通信协议的制定。
二、背景单片机与上位机通信的目的在于实现数据的传输和控制命令的交互。
因此,在制定通信协议之前,需要明确通信双方的需求和目标。
1. 确定通信目的首先,需要明确单片机与上位机通信的目的。
是用于数据采集和显示?还是用于远程控制和监测?不同的通信目的将影响通信协议的设计和实现。
2. 确定通信方式通信方式包括串行和并行通信。
串行通信一般使用UART或SPI等协议,而并行通信则通过并口实现。
在选择通信方式时,需要考虑通信速率、数据传输距离和抗干扰能力等因素。
3. 确定通信协议通信协议是单片机与上位机之间信息交换的规范。
通常情况下,通信协议包括帧格式、通信协议头、数据校验等内容。
在制定通信协议时,需要考虑以下因素:- 帧格式:确定数据传输的起始位、数据位、校验位和停止位等信息。
- 通信协议头:用于标识数据包的类型和长度。
- 数据校验:确保数据传输的准确性和完整性,常用的校验方式包括校验和、CRC等。
三、制定通信协议步骤1. 确定通信需求首先,明确单片机与上位机通信的需求和目标。
确定通信的目的、通信方式和通信频率等。
2. 设计帧格式根据通信需求,设计合适的帧格式。
确定数据起始位、数据位、校验位和停止位等信息。
3. 设计通信协议头设计通信协议头,用于标识数据包的类型和长度。
通常可以使用固定长度或变长长度的方式进行设计。
4. 确定数据校验方式根据通信需求和数据传输的可靠性要求,选择合适的数据校验方式。
单片机和上位机协议一、引言随着科技的快速发展,单片机在各个领域得到了广泛的应用。
而单片机与上位机之间的通信协议也成为了重要的研究方向。
本文将探讨单片机与上位机之间的通信协议,包括协议的基本原理、常见的协议类型以及它们的应用场景等。
二、单片机与上位机之间的通信协议基本原理单片机与上位机之间的通信协议是为了实现两者之间的数据交换和通信而设计的。
协议的基本原理是通过一定的规则和约定,实现数据的传输和解析。
常见的单片机与上位机通信协议包括串口通信、USB通信、以太网通信等。
其中,串口通信是最常见和简单的通信方式。
它通过串口线将单片机与上位机连接起来,通过发送和接收数据来实现通信。
串口通信具有成本低、易于实现等优点,广泛应用于各个领域。
三、常见的单片机与上位机通信协议类型1. 串口通信协议串口通信协议是最常见和简单的通信方式。
它使用串口线将单片机与上位机连接起来,通过发送和接收数据来实现通信。
常见的串口通信协议包括RS232、RS485等。
RS232是一种标准的串行通信接口,广泛应用于计算机、工业自动化等领域;RS485是一种多点通信协议,支持多个设备同时通信,适用于工业控制系统等应用场景。
2. USB通信协议USB通信协议是一种高速、可靠的通信方式。
它通过USB接口将单片机与上位机连接起来,实现数据的传输和通信。
USB通信协议具有带宽大、速度快等优点,广泛应用于外设设备、嵌入式系统等领域。
常见的USB通信协议包括USB1.1、USB2.0、USB3.0等。
3. 以太网通信协议以太网通信协议是一种广域网通信协议,它通过以太网接口将单片机与上位机连接起来,实现数据的传输和通信。
以太网通信协议具有传输速度快、可靠性高等优点,广泛应用于局域网、互联网等领域。
常见的以太网通信协议包括TCP/IP、UDP等。
四、单片机与上位机通信协议的应用场景单片机与上位机通信协议在各个领域都有着广泛的应用。
在工业控制领域,单片机与上位机通信协议被用于监控系统、物联网等方面。
单片机与组态王的通信实例随着工业自动化的发展,越来越多的设备开始采用单片机进行控制。
而组态王作为一种通用的组态软件,可以方便地对单片机的控制过程进行监控和操作。
本文将介绍一个单片机与组态王通信的实例,以帮助读者了解二者的基本通信原理和实现方法。
一、单片机与组态王的通信方式单片机与组态王之间的通信一般采用串口通信方式。
串口通信是一种常见的通信方式,它通过串口数据线将单片机与计算机连接起来,实现数据传输。
在组态王中,可以通过设置串口参数来与单片机进行通信。
二、单片机通信协议在单片机与组态王通信的过程中,需要约定一些通信协议来实现数据的传输和控制。
通信协议一般包括数据格式、波特率、校验方式等。
根据不同的单片机和组态王版本,通信协议可能会有所不同,需要根据实际情况进行调整。
三、组态王通信控件的使用在组态王中,可以使用串口通信控件来实现单片机与组态王之间的通信。
控件提供了许多函数和属性,可以方便地进行串口通信。
例如,可以使用控件的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 引言随着工业化要求提高,分布式系统发展以及控制设备与监控设备之间通讯需要,组态软件设计的监控系统逐步普及。
现在组态软件繁多,比如KingVieW(组态王>、MCGS、W inCC等。
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的干扰有较强的抑制能力。
当两条线绞在一起时,被通信各种分布参数耦合过来的干扰信号可平均地分配到这两条线上,因此对RS-485的差分式传输线路而言,用双绞线可获得较强的抗干扰能力。
RS-485采用二线与四线平衡传输方式,二线制可实现真正的多点双向通信,但需要在传输线上接电阻(约120 Ω>。
由于80C51系列单片机STC89C52串行接口的,TTL电气特性与RS-485电气特性不相符,STC89C52不能与RS-485直接连接,需要电气转换。
单片机与组态王软件通讯的解决方案
1、引言
组态王软件作为一种工业控制组态软件在国内已得到了非常广泛的应用。
其具有强大的硬件支持能力,对国内外绝大多数PLC、变频器、板卡、模块、仪器仪表都编写了相应的驱动程序,使用起来相当方便快捷。
在农水实验田环境监测项目中,我们使用的硬件设备包括日本三菱PLC、台湾研华亚当模块及自行开发的基于单片机的分析仪器,我们选择的软件开发平台是组态王软件。
因此,实现单片机与组态王的数据通讯是一个必须解决的问题。
2、单片机与组态王软件通讯的解决方案
2.1 两种通讯解决方案
单片机与组态王软件通讯的解决方案有两种,其一是直接编写支持单片机的驱动程序,就象组态王支持PLC 一样;其二是利用组态王软件和Visual Basic 都支持DDE 的特点,以VB 为开发平台,写一个数据通讯应用程序,一方面
实现与单片机的连接,另一方面实现与组态王的动态数据交换。
2.2 两种方案的比较
第一种方案的优点是程序结构比较紧凑,数据通讯效率较高;缺点是必须由对组态王软件内核比较清楚的程序员开发,开发周期较长。
第二种方案可由一般的程序员开发,缺点是数据通讯效率较低。
在本项目中,我们采用了第二种方案。
3、基于DDE 方案的实现
3.1 DDE 的概念
DDE 是WINDOWS 平台上的一个完整通信协议,它使应用程序能彼此交换数据和发送指令。
DDE 过程可以比喻为两人对话,一方向另一方提出问题,然。
组态王通用单片机协议(ASCII)概述通用单片机ASCII协议支持单片机与组态王通讯,用户只要按照我们的协议编写单片机通讯程序就可实现与组态王的通讯.组态王设置1、定义组态王设备定义组态王定义设备时请选择:智能模块\单片机\通用单片机ASCII\串口组态王的设备地址定义格式:##.#前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,"0"为不打包、"1"为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作,与单片机的程序无关.2、组态王通讯通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致组态王数据词典--变量定义在组态王中定义的寄存器数据格式(类型):由单片机决定。
斜体字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。
组态王通用单片机协议(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。
组态王和TSX Micro等设备通过Unitelway协议通讯的参数设置文档1.组态王提供的Unitelway驱动支持情况概述亚控提供的UniTelway驱动:Micro37.dll支持组态王与Micro、Premium等支持UniTelway协议的系列PLC进行通讯,此驱动要求在计算机和PLC组成的UniTelway网络中,至少有一个PLC作为主站(一般情况下该主站地址默认为0),而组态王是作为其中的一个从站点(并且地址固定为1),所以在PLC的主从配置中,不能再有其他PLC的节点地址设置为1。
此协议使用串行通讯,使用计算机中的串口。
2.通讯参数的设置为了保证组态王与PLC的通讯质量,必需对PLC进行如下正确设置:2.1 PLC设备驱动的设置第一步: 打开XWAY Manager(在控制面板中)或:程序->Modicon Telemecanique->XWAY Driver Manager)第二步: 点击“UNITELWAY->configuration”,见下图:点击“Configuration”弹出下图点击“Edit”弹出下图“根据工程的要求设置通讯好参数后,点击“OK”第三步:设置完成后,退出“XWAY Manager”。
2.2.PLC通讯参数的设置第一步:使用编程软件新建/打开PLC工程,检查PLC硬件通讯参数配制与2.1中的配置是否一致;如果不一致,虽然能够通讯,但对通讯速度会有影响;因此PLC的通讯参数要与XWAY Driver保持一致。
第二步:其它参数的设置PLC的编程软件中,Number of Slaves(子站的个数)—可选为:3-8。
为了提高PLC “点名”的速度(Uniteway协议补充说明:该协议中,作为主站的PLC是通过“点名”的方式和各个从站建立通讯的),须根据实际从站的数量进行选择;若只有一个PLC和一个上位机组态王通讯,应选择“3”。
Wait Time —(默认为30mS)这个时间是PLC与设备通讯交换数据的等待时间,与组态王通讯时设置值应略大于组态王IO变量定义的采集时间/子站个数,如:组态王IO变量的采集频率为100mS,此处设为35mS为宜。
单片机与上位机通信协议的制定单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!上行协议,即由单片机向上位机发送数据。
下行协议,即由上位机向单片机发送数据。
而通信协议又要分固定长度和不定长度两种本文所介绍的协议属于简单的固定字长的通信协议!下行协议由四个字节构成上表是简单的上位机对单片机的控制指令下述函数是C艸封装的串口通信类中的发送函数的封装public void SerSe ndCommu(byte orderDef, byte data)// 参数1为命令字,参数二为要发送的数//据,需要时可直接调用Byte[] BSe ndTemp = new Byte[SEND_LENTH];BSe ndTemp[O] = PRE;BSe ndTemp[1] = orderDef;BSe ndTemp[2] = data;BSe ndTemp[3] = END; this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);}下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断ISR(USART_RXC_vect) 〃串口接收中断{un sig ned char status,data;status = UCSRA; //** 首先读取UCSRA勺值,再读取UDR fi,顺序不能颠倒,否则读取UDR后的UCSRA勺//值即会改变**data = UDR;if(!Uart_RecvFlag)〃判断缓存中的数据是否读完,读完则接收指令{if((status&( (1<<FE)|(1<<PE)|(1<<DOR)))==0){rx_buffer[rx_cou nter]=data;rx_co un ter++;switch(rx_cou nter){case 1:if(data!=USART_BEGIN_STX)rx_co un ter=0;break;case 4:rx_co un ter=0;if(data==USART_END_STX)Uart_RecvFlag=1;break;}}}在单片机主循环程序的最前部分进行指令译码if(Uart_RecvFlag)〃接收到命令{ _switch(rx_buffer[1]){ _case OxAA://单片机状态命令控制;ucWorkStatue=rx_buffer[2];〃指令数据break;case OxDD://PWM值修改指令OCR2=rx_buffer[2];break;case 0xFF://初始温度设定break;} Uart_RecvFlag=0;} _//随后进行执行指令switch(ucWorkStatue) {case 1:// 空闲模式break;case 2://测量模式,但不输出break;case 3://测量模式,由串口输出break; case 4://PWM输出测试break;default:break;}这样就可以利用串口对单片机进行在线命令控制了;上行协议的制定!和下行协议基本一致!在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长//串口发送缓冲区变量声明volatile un sig ned char tx_buffer[TX_BUFFER_SIZE];〃定义串口发送缓冲区volatile unsigned char tx_wr_index=0,tx_rd_index=0,tx_counter=0;//rx_wr_index 针,rx_rd」ndex 读指针,rx_counter 缓冲区数据个数写指//USART发送函数void USART_Transmit(unsigned char data)// 发送数据函数{while(tx_counter==TX_BUFFER_SIZE);// 输出缓冲区满,等待asm("cli");if(tx_counter||((UCSRA & DATA_REGISTER_EMPTY)==0)){tx_buffer[tx_wr_index]=data;if(++tx_wr_index==TX_BUFFER_SIZE)tx_wr_index=0;++tx_counter;}elseUDR = data;asm("sei");}// 发送中断服务程序ISR(USART_TXC_vect)//USAR■发送数据中断{if(tx_counter){--tx_counter;UDR=tx_buffer[tx_rd_index]; if(++tx_rd_index==TX_BUFFER_SIZE){tx_rd_index=0;}}}在C#编写的上位机中,利用串口接收事件响应方法定义serialPort1.ReceivedBytesThreshold = RECEIVE_LENTH;在时间响应事件中调用协议分析处理函数serialPortCaculate() 来分析协议private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e){bel_dispzedNum.Invoke(newMethodInvoker(delegateint inNumSData=0; try{inNumSData =this.serialPort1.BytesToRead;b_serial_bufin_diplay.T// 串行数据处理 // 图像显示 byte dataID= 0x00; double temp =this.serialPortCaculate(ref dataID);switch(dataID){case TEMVAL:()break;}// 匿名方法catch { }ext = inNumSData.ToString();break;default:this.serialPort1.DiscardInBuffer}));/////// 接收转换协议, 接收数据时直接调用private double serialPortCaculate(ref byte dataID){Byte[] BReceiveTemp = new Byte[RECEIVE_LENTH];for (int i = 0; i < RECEIVE_LENTH; i++)// 接收定长数据字符串{ BReceiveTemp[i] = Convert.ToByte(this.serialPort1.ReadByte());}dataID=BReceiveTemp[1];switch (BReceiveTemp[1]){case TEMVAL: default :}}。
一、通讯参数:通讯参数包括数据位,停止位,波特率、校验方式。
数据位、停止位、波特率由单片机决定。
组态王中的设定和单片机一致即可。
校验方式参照“数据传输格式”中相关部分。
二、数据传输格式:格式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字节。
组态王和TSX Micro等设备通过Unitelway协议通讯的参数设置文档1.组态王提供的Unitelway驱动支持情况概述亚控提供的UniTelway驱动:Micro37.dll支持组态王与Micro、Premium等支持UniTelway协议的系列PLC进行通讯,此驱动要求在计算机和PLC组成的UniTelway网络中,至少有一个PLC作为主站(一般情况下该主站地址默认为0),而组态王是作为其中的一个从站点(并且地址固定为1),所以在PLC的主从配置中,不能再有其他PLC的节点地址设置为1。
此协议使用串行通讯,使用计算机中的串口。
2.通讯参数的设置为了保证组态王与PLC的通讯质量,必需对PLC进行如下正确设置:2.1 PLC设备驱动的设置第一步: 打开XWAY Manager(在控制面板中)或:程序->Modicon Telemecanique->XWAY Driver Manager)第二步: 点击“UNITELWAY->configuration”,见下图:点击“Configuration”弹出下图点击“Edit”弹出下图“根据工程的要求设置通讯好参数后,点击“OK”第三步:设置完成后,退出“XWAY Manager”。
2.2.PLC通讯参数的设置第一步:使用编程软件新建/打开PLC工程,检查PLC硬件通讯参数配制与2.1中的配置是否一致;如果不一致,虽然能够通讯,但对通讯速度会有影响;因此PLC的通讯参数要与XWAY Driver保持一致。
第二步:其它参数的设置PLC的编程软件中,Number of Slaves(子站的个数)—可选为:3-8。
为了提高PLC “点名”的速度(Uniteway协议补充说明:该协议中,作为主站的PLC是通过“点名”的方式和各个从站建立通讯的),须根据实际从站的数量进行选择;若只有一个PLC和一个上位机组态王通讯,应选择“3”。
Wait Time —(默认为30mS)这个时间是PLC与设备通讯交换数据的等待时间,与组态王通讯时设置值应略大于组态王IO变量定义的采集时间/子站个数,如:组态王IO变量的采集频率为100mS,此处设为35mS为宜。
组态王与单片机的通信与设计前言本文主要是解决装有组态王的PC机与单片机的通信问题,这里选择通过计算机的COM1口进行串行通信。
单片机和PC机的串行通行一般采用RS-232、RS-422或RS-485总线标准接口,也有采用非标准的20mA电流环的。
为保证通信的可靠,在选择接口时必须注意:(1)通信的速率;(2)通信距离:(3)抗干扰能力;(4)组网方式,既可以保证正常通信时的最大通信端口数量。
这里采用RS-232接口与单片机通信的方法。
由于两者间的电平规范不一致,实现两者间的通信要解决接口电路的电平转换问题。
正文选题背景随着单片机和微机技术的不断发展,单片机的应用也从独立的单机向网络发展,由PC机和多台单片机构成的多级网络测控系统已成为单片机技术发展的一个方向。
在一个大型的应用系统中,通常由单片机完成数据的采集和上传,后台则通过PC机对数据进行分析并处理,复杂的还要建立数据库形成网络,二者的结合,充分发挥了单片机在实时数据采集和微机对图形处理、显示以及数据库管理上的优点,使得单片机的应用已不仅仅局限于传统意义上的自动监测或控制,而形成了向以网络为核心的分布式多点系统发展的趋势。
随着微电子技术、计算机控制技术、工业以太网技术及现场总线技术的发展,作为用户无需改变运行程序原代码的软件平台工具——工控组态软件日渐成熟。
由于工控组态软件在实现工业控制的过程中免去了大量烦琐的编程工作,解决了长期以来控制工程人员缺乏计算机专业知识与计算机专业人员缺乏控制操作技术和经验的矛盾,极大地提高了自动化工程的工作效率。
近年来,工控组态软件在中小型工业过程控制工程、工业自动化工程中越来越受到欢迎。
不仅如此,工控组态软件还在配电自动化、智能楼宇、农业自动化、能源监测等领域也逐步展示了其独特的优势。
单片机控制系统以其高性能价格比、稳定、易于实现等特点而被广泛使用,但他难以实现动态复杂的图形监控界面;而组态王软件具有强大丰富的监控界面设计功能,却难以实现复杂的控制算法,而单片机则难以实现动态复杂的图形监控界面,若采用以单片机为下位机,以装有组态王的PC极为上位机的控制方式,将彻底改变原来单片机控制系统的单调、简单的控制界面的缺陷,进一步推动单片机控制方式的广泛应用。
目前在工业控制现场的仪表较多,传统的数显仪表不能满足实际的需要,需要添加相应的A /D 或D /A 模块转换数据,上位机需要通过配套的下位机数据采集模块获取现场仪表数据,如PLC ,再通过相应通信协议来与下位机通讯进行数据交换,此法成本较高。
本文论述了通过单片机采集现场仪表数据,通过与组态软件提供的通用ASCII 型协议通讯。
实践表明:采用该方式通讯可靠、设计简单、代码可移植性高,实用性较强。
1组态王与单片机通讯协议概述单片机多用来采集现场的信息,如何实现单片机与组态软件进行数据交换?早期主要有DDE 方式、板卡方式等,最新版本组态王提供的单片机通用通讯协议支持HEX 型和ASCII 型,可通过串口直接与单片机通讯。
通讯方式为RS232、RS422、RS485,通讯波特率可达19200bps 。
蔚俊兰、赵学军等人介绍了采用HEX 型通讯协议来实现单片机与组态王通讯。
本文主要详细介绍ASCII 型通用通讯协议实现组态王与单片机通讯,该型具有设计简单,通俗易懂特点,具体参数可以查阅相关技术文档。
2组态王设备配置在实际开发过程中,组态王对ASCII 型通讯协议完全是封装好的。
在程序设计过程中可以采用相应串口监视软件来分析组态王向单片机发送的数据,便于程序设计。
为了实现单片机与组态王的通讯,在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致。
本文中采用通讯波特率9600bps ,8位数据位,1位停止位,无奇偶验证。
组态王中设置设备地址格式为:##.#。
前面两个字符是设备地址(0~255),此地址为单片机的地址;后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包。
体参数设定方法可以查阅相关技术文档。
3单片机通讯源程序设计本文的通讯程序采用C 语言设计,通过Keil 开发软件设计了单片机与组态王基于ASCII 码通用通讯程序。
3.1数据定义数据定义主要用于对单片机相关参数进行相应设定,如单片机地址,单片机与组态王通讯命令格式的字头、字尾。
组态王软件与单片机串口ascii通讯的机制及实现方法作者:姜宝申组态软件广泛的应用于工农业生产的各个领域,是保证相关系统设备经济稳定安全运行的重要方式,是对传统控制方式的一次革命,得到了越来越广泛的应用。
很多工控及电子爱好者对这方面很感兴趣,都跃跃欲试,可苦于软件要想得到实际效果,就得连接设备,通过设备预设的寄存器与软件的变量进行连接,辅以命令语言,才能取得真正的体验。
软件支持的设备比如板卡、数字仪表、PLC、变频器等等都是属于工控设备,价格都比较昂贵,一般很难触及。
那是不是组态软件就不适合于我们用了呢,也不一定,比如国产的组态王组态软件支持单片机串口ascii 通讯,烧写了相应程序的单片机也可以当做组态软件的设备,和其他设备一样,也能完成诸如水位、行程等状态的监视及电机、阀门、灯泡、加热器等的启动停止,开与关,以及模拟量经AD转换后,通过串口以ascii码的形式传送给组态软件,只是这些功能的实现是依靠单片机的端口来完成,组态软件访问单片机,监视单片机所有端口状态,控制一部分端口的高低电平状态,辅以外部电气回路,同样能实现相应的功能。
例如:组态软件通过串口发送指令,控制单片机的某个输出端口的电平高低变化,端口通过驱动使继电器的触点闭合,电机转动,假如这个电机是带动水泵往水箱里面打水,水箱水位的预定位置装有触点,这个触点连接在单片机的另一个输入端口上,当水位到达触点位置,触点动作单片机的这个端口电平发生变化,这个变化通过同一个串口传回给组态软件,组态软件可以根据命令语言编写的程序酌情是自动还是手动停止电机运行,或者是调整电机的转速,保证水箱的水位在预设的范围内,这就是组态软件构成的控制系统的最基本应用。
图1相对而言,用单片机与组态软件实现的控制系统要比其他成品设备的组态稍微麻烦一些,不但需要了解掌握组态软件的工作机制,还需要单片机的软硬件及电路方面的知识,这里边的重点就是单片机的汇编或c语言编程,但掌握了组态软件的通讯协议,按协议编写,比较起来并不是很难。
一、通讯参数:通讯参数包括数据位,停止位,波特率、校验方式。
数据位、停止位、波特率由单片机决定。
组态王中的设定和单片机一致即可。
校验方式参照“数据传输格式”中相关部分。
二、数据传输格式:格式1、组态王发送地址请求格式:(此时检验位为1)格式2、单片机应答地址格式:(此时检验位为0)格式3、组态王读数据请求格式:(此时检验位为0)格式4、单片机应答读数据格式(正确):(此时检验位为0)格式5、单片机应答读数据格式(错误):(此时检验位为0)格式6、组态王写数据请求格式:(此时检验位为0)格式7、单片机应答写数据格式(正确):(此时检验位为0)三、时序:读数据:写数据:四、协议说明:数据传输:所有数据均为16进制数Sta::设备地址1字节R:读标志1字节(0x52)W:写标志1字节(0x57)DataType;需要交换的数据类型,1字节。
1,字节;2,字,3,浮点型。
DataNum:要读取的数据的数量,1字节。
DataAddr;为数据偏移地址2字节,低字节在前,高字节在后Data:实际传输的数据,低字节在前,高字节在后DataLong: 单片机返回Data的字节数,2字节,低字节在前,高字节在后CRC:为从第一个字节至CRC前的所有字节的异或值,1字节ErrorCode:1.通讯口设置:通讯方式:RS-232,RS-485,RS-422均可。
波特率:由单片机决定(2400,4800,9600and19200bps)。
字节数据格式:由单片机决定。
注意:在组态王中设置的通讯参数如波特率,数据位,停止位,奇偶校验必须与单片机编程中的通讯参数一致2.在组态王中定义设备地址的格式格式:##.#前面的两个字符是设备地址,范围为0-255,此地址为单片机的地址,由单片机中的程序决定;后面的一个字符是用户设定是否打包,“0”为不打包、“1”为打包,用户一旦在定义设备时确定了打包,组态王将处理读下位机变量时数据打包的工作。
3.在组态王中定义的寄存器格式斜体字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码)说明;字头: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.上位机发送读命令下位机应答:若正常:若不正常:例1:读15号仪表,数据地址为15的数据。
其中数据为100,数据类型为字节,不打包。
组态王所发数据为:若正确:若不正确:例2:读15号仪表,数据地址为15的数据。
其中数据为100,数据类型为字节,打包。
组态王所发数据为:若正确:若不正确:3.2.上位机发送写命令下位机应答:若正常:若不正常:例1:写15号仪表,数据地址为15。
写数据255,数据类型为字,不打包。
组态王所发数据为:若正确:若不正确:例2:写15号仪表,数据地址为15。
写数据65535,数据类型为浮点型,打包。
组态王所发数据为:若正确:若不正确:3、注:仪表内部数据为十六进制表示的十进制数。
如:实时测量值为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;}。