单片机与MCGS多机通讯的实现
- 格式:doc
- 大小:13.00 KB
- 文档页数:2
基于Modbus的飞思卡尔单片机与MCGS触摸屏通信的实现刘先越; 朱娜; 郭隆军【期刊名称】《《机电设备》》【年(卷),期】2019(036)004【总页数】7页(P28-34)【关键词】船舶电力系统; ModbusRTU; 飞思卡尔单片机; MCGS触摸屏【作者】刘先越; 朱娜; 郭隆军【作者单位】中国人民武装警察部队海警学院浙江宁波 315801; 中国舰船设计研究中心湖北武汉 430064; 中国船舶重工集团第七一一研究所上海 201108【正文语种】中文【中图分类】TN910 引言传统的PLC与触摸屏进行通信实现人机交互的方式虽然有着功能可靠、触点多等优点,但随着船舶电力系统集成度变高,PLC的数据处理和管理能力已无法满足现代船舶要求。
因此,随着单片机嵌入式系统在船舶领域应用越来越广泛,在Modbus协议下的单片机与触摸屏人机交互控制方式得以实现。
根据船舶环境恶劣、工况复杂等特点,本文采用成本低、可靠性高、抗干扰性强的飞思卡尔单片机与昆仑通态 MCGS进行通信试验,详细阐述了 MCGS触摸屏所支持的ModbusRTU协议指令系统的组成及其应答格式,软件设计和试验测试。
1 Modbus RTU协议1.1 Modbus RTU报文格式Modbus通信协议是工业中最开放、通用的协议之一,该协议采用主从应答通信,详细规定了主从应答通信行为,定义了设备能够识别和使用的报文结构。
Modbus 报文帧分为ASCII帧和RTU帧,两种帧格式只在起始位、结束符和校验码上有所区别,其中,RTU帧被MCGS中的“莫迪康Modbus RTU”设备驱动所支持。
这里只介绍RTU帧,ASCII帧可以参考该介绍。
RTU报文帧格式见表1。
使用RTU帧的报文发送需延时≥3.5个字符;设备地址及功能码为1字节;数据区由n个字节组成,每个字节8位;校验区为16位,分两个字节承载低八位和高八位。
表1 RTU报文帧格式帧格式所占字符数起始位≥3.5字符设备地址 8位功能代码8位数据 n个8位CRC校验 16位结束符≥3.5字符网络设备不断侦测网络总线,包括停顿间隔;每个设备都进行解码,以判断数据是否是发给自己的;在最后一个字符结束之后,当接收数据延时≥3.5个字符后,一个新的报文可在此之后开始[1]。
单片机多机通信实现随着科技的进步和应用的需求,单片机成为了嵌入式系统中不可或缺的一部分。
在很多应用场景中,我们需要将多个单片机之间进行通信,以实现数据的传输和协同工作。
本文将介绍单片机多机通信的实现方法。
一、串口通信串口通信是最常见和简单的单片机通信方式之一。
单片机通过串口将数据以字节的形式传输给另一个单片机。
常见的串口通信协议有RS232、RS485和UART等。
其中,RS232是单片机与计算机之间的标准通信协议,而RS485适用于单片机与多个设备之间的通信。
串口通信需要注意以下几个方面:1. 波特率的设置:通信双方需要设定相同的波特率,以确保数据的准确传输。
2. 数据格式的规定:包括数据位、校验位和停止位等,通讯双方需要设置相同的数据格式。
3. 通信控制的实现:通过编程控制单片机的串口发送和接收功能,实现数据的传输。
二、I2C通信I2C(Inter-Integrated Circuit)是一种串行总线协议,它可实现多个单片机的通信和协同工作。
I2C通信需要引入一个主设备和多个从设备的概念,主设备控制通信的起止和数据的传输,从设备用于接收和发送数据。
I2C通信需要注意以下几个方面:1. I2C地址的分配:每个从设备通过唯一的地址与主设备进行通信,地址的分配需要事先规划好。
2. 数据的读写操作:通过发送特定的控制信号,主设备可以向从设备发送读或写的命令,并接收从设备返回的数据。
3. 时序的控制:I2C通信依赖于时钟信号和数据信号的同步,通信双方需要根据协议规定好时序的控制。
三、SPI通信SPI(Serial Peripheral Interface)通信是一种全双工、同步的通信协议。
它通过4根线进行通信,包括时钟、数据输入、数据输出和片选信号。
SPI通信适用于多个主设备与多个从设备之间的通信,可以实现数据的传输和设备的控制。
SPI通信需要注意以下几个方面:1. 主从设备的选定:SPI通信中,每次只有一个主设备能够与从设备进行通信,其他设备通过片选信号进行选择。
MCGS与PLC的通信方法MCGS(Machine Control & Graphic System)是一种人机界面和监控系统,而PLC(Programmable Logic Controller)则是一种可编程逻辑控制器。
MCGS和PLC可以通过多种通信方法实现数据的交互和控制指令的传输。
下面将详细介绍MCGS与PLC的通信方法。
1.RS232串口通信:RS232串口通信是一种常见的MCGS与PLC通信方式。
MCGS和PLC分别通过串口线连接,使用串口通信协议进行数据的传输。
RS232串口通信速率较低,但简单、稳定且易于实现。
2.RS485串口通信:RS485串口通信是一种多点通信方式,适用于多个PLC与一个MCGS之间的通信。
MCGS作为主站,PLC作为从站。
RS485串口通信速率较高,可实现快速数据传输。
3.网口通信:网口通信是一种基于以太网的通信方式,实现了MCGS与PLC之间的远程通信。
通过网口通信,MCGS可以连接到PLC所在的局域网或广域网,并实现数据的实时传输和控制指令的发送。
4.MODBUS通信:MODBUS是一种通用的串行通信协议,常用于MCGS与PLC之间的通信。
MODBUS可以通过RS485串口通信或网口通信实现,支持多种数据类型,包括寄存器读写、线圈状态读写等。
5. OPC通信:OPC(OLE for Process Control)是一种开放的标准,用于实现不同设备和软件之间的通信。
MCGS和PLC可以通过OPC通信实现数据的共享和交互,实现高效的生产监控与控制。
6.移动通信:随着移动互联网的普及,MCGS与PLC之间也可以通过移动通信方式实现远程监控和控制。
通过移动数据通信网络(如4G、5G等),MCGS可以连接到PLC所在的远程设备,并实时获取数据和发送控制指令。
需要注意的是,不同的通信方式适用于不同的应用场景,具体的选择应根据实际需求和系统要求进行。
此外,通信时需确保通信设备的参数设置正确,如波特率、数据位、校验位等。
MCGS软件与MCS51单片机多机通信的几种方法Multi-machineSerialCommunicationMethodbetweenConfigurationSoftwareMCGSandMCS51SCMLia oningMechanicAndElectricityProfessionTechnologyAcademyInformationInstrumentliu naPostcode:118002[摘要]MCGS是目前较常见的一种工业控制通用组态软件,可以利用它十分方便地构成了分布式系统的监控画面,动态显示控制设备的运行状态、实时、历时曲线和报表、上下限报警等。
在该系统中对于由多个MCS51单片机控制的下位机仪表,其工作由MC Multi-machine Serial Communication Method between Configuration Software MCGS and MCS51 SCM Liaoning Mechanic And Electricity Profession Technology Academy Information Instrument liuna Postcode:118002[摘要] MCGS是目前较常见的一种工业控制通用组态软件,可以利用它十分方便地构成了分布式系统的监控画面,动态显示控制设备的运行状态、实时、历时曲线和报表、上下限报警等。
在该系统中对于由多个MCS51单片机控制的下位机仪表,其工作由MCGS远程监控,充分利用计算机的资源进行各种管理。
那么对于MCGS与MCS51单片机多机组成的系统如何设计其通信方式,本文介绍几种工程中可用的通信方法。
[abstract] MCGS is the normal industry configuration software. We can use it to consist apicture of DCS system , it can display the device’s dynamic moving state, the moment 、history curves and reports、high and low alarm。
#include <avr/io.h>#include <avr/interrupt.h>#include <util/delay.h>#include "ds18b20.h"#define uchar unsigned char#define uint unsigned intvolatile uchar reve_data,renum=0,mend=0,nend=0,a1=1,a2=1,a3=1,a4=1,a5=1,a6=1,a7=1,a8=1,a9=1; void INT_Init();#define BAUD 38400 //波特率38.4kbp/svolatile uchar rx[7]={0x01,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00};uchar tx[30];volatile uchar crcl=0x00,crch=0x00;uchar led=0xff;//发送字符void send_char( uchar data ){/* 等待发送缓冲器为空 */while ( !( UCSRA & (1<<UDRE)) );/* 将数据放入缓冲器,发送数据 */UDR = data;}void inti_port(){DDRB=0xff;PORTB=0xff;DDRC=0xff;PORTC=0x00;}//CRC效验,将结果存储到CRCok变量中。
checkcrc(uchar *q,uchar nend){uint wcrc=0xffff;int j=0,i=0;for(i=0;i<nend;i++){wcrc ^= *q++;for(j=0;j<8;j++){if(wcrc&1){wcrc>>=1;wcrc ^= 0xa001;}else{wcrc>>=1;}}}crcl = wcrc;crch = wcrc>>8;}int main(void){inti_uart();inti_port();INT_Init();sei();while(1){gettemp();_delay_ms(1050);}}SIGNAL(SIG_UART_RECV){rx[renum++]=UDR;if(renum==8){renum=0;switch(rx[1]){case 0x01:if(!rx[3]){tx[0]=rx[0];//leD灯tx[1]=rx[1];tx[2]=0x01;DDRB=0X00;tx[3]=PORTB;DDRB=0XFF;checkcrc(tx,4);tx[4]=crcl;tx[5]=crch;send_string(tx,6);break;}else{tx[0]=rx[0];//继电器和蜂鸣器tx[1]=rx[1];tx[2]=0x01;DDRC=0X00;tx[3]=PORTC;tx[3]>>=7;DDRC=0XFF;checkcrc(tx,4);tx[4]=crcl;tx[5]=crch;send_string(tx,6);break;}case 0x04:tx[0]=rx[0];tx[1]=rx[1];tx[2]=rx[5]<<1;tx[3]=0x00;tx[4]=teml;tx[5]=0x00;tx[6]=temh;checkcrc(tx,nend=tx[2]+3);tx[tx[2]+3]=crcl;tx[tx[2]+4]=crch;send_string(tx,mend=tx[2]+5);break;case 0x05:DDRB=0XFF;switch(rx[3]){case 0x00:if(!rx[4])PORTB &= ~(1<<PB0);elsePORTB |= (1<<PB0);break;case 0x01:if(!rx[4])PORTB &= ~(1<<PB1);elsePORTB |= (1<<PB1);break;case 0x02:if(!rx[4])PORTB &= ~(1<<PB2);elsePORTB |= (1<<PB2);break;case 0x03:if(!rx[4])PORTB &= ~(1<<PB3);elsePORTB |= (1<<PB3);break;case 0x04:if(!rx[4])PORTB &= ~(1<<PB4);elsePORTB |= (1<<PB4);break;case 0x05:if(!rx[4])PORTB &= ~(1<<PB5);elsePORTB |= (1<<PB5);break;case 0x06:if(!rx[4])PORTB &= ~(1<<PB6);elsePORTB |= (1<<PB6);break;case 0x07:if(!rx[4])PORTB &= ~(1<<PB7);elsePORTB |= (1<<PB7);break;case 0x08:if(rx[4])PORTC |= (1<<PC7);elsePORTC &= ~(1<<PC7);break;}send_string(rx,8);break;default : break;}}}//*****************************红外线接收**********************************************////外部中断初始化void INT_Init(void){MCUCR |= _BV(ISC01); //选择外部中断0,下降沿触发中断MCUCR &= ~_BV(ISC00); //10:INT0的下降沿产生异步中断请求GICR |= (1 << INT0); //使能外部中断请求0DDRD &= ~_BV(PD2); //设置为输入,PORTD |= _BV(PD2); //使能上拉电阻}SIGNAL(SIG_INTERRUPT0){cli();uchar i,j,k = 0,addr[4] = {0};renum=0;GICR &= ~(1 << INT0); //禁止外部中断INT0 关闭外部中断,开始接受数据 for(i = 0;i < 14;i++){_delay_us(400);if(PIND & (1 << PD2)) //9MS内有高电平,则判断为干扰,退出处理程序 {GICR |= (1 << INT0); //使能外部中断INT0return;}}while(!(PIND & (1 << PD2))); //等待9ms低电平过去for(i = 0;i < 4;i++) //{for(j = 0;j < 8;j++)//{while(PIND & (1 << PD2)); //等待4.5ms高电平过去while(!(PIND & (1 << PD2))); //等待变高电平while(PIND & (1 << PD2))//计算高电平时间{_delay_us(100);k++;if(k >= 30) //高电平时间过长,则退出处理程序{GICR |= (1 << INT0); //使能外部中断INT0return; //}}addr[i] = addr[i] >> 1; //接受一位数据if(k >= 8){addr[i] = addr[i] | 0x80; //高电平时间大于0.56,则为数据1 }k = 0; //计时清零}}switch(addr[3]){DDRB=0XFF;case 0x07: if(a1){PORTB &= ~(1<<PB0);a1=0;}else{PORTB |= (1<<PB0);a1=1;}break;//1case 0x0b: if(a2){PORTB &= ~(1<<PB1);a2=0;}else{PORTB |= (1<<PB1);a2=1;}break;//2case 0x0f: if(a3){PORTB &= ~(1<<PB2);a3=0;}else{PORTB |= (1<<PB2);a3=1;}break;//3case 0x13: if(a4){PORTB &= ~(1<<PB3);a4=0;}else{PORTB |= (1<<PB3);a4=1;}break;//4case 0x17: if(a5){PORTB &= ~(1<<PB4);a5=0;}else{PORTB |= (1<<PB4);a5=1;}break;//5case 0x1b: if(a6){PORTB &= ~(1<<PB5);a6=0;}else{PORTB |= (1<<PB5);a6=1;}break;//6case 0x1f: if(a7){PORTB &= ~(1<<PB6);a7=0;}else{PORTB |= (1<<PB6);a7=1;}break;//7case 0x23: if(a8){PORTB &= ~(1<<PB7);a8=0;}else{PORTB |= (1<<PB7);a8=1;}break;//8case 0x03: if(a9)//蜂鸣器和继电器{PORTC |= (1<<PC7);a9=0;}else{PORTC &= ~(1<<PC7);a9=1;}break;//8case 0x27: PORTB=0X00;break;//9case 0x2b: PORTB=0XFF;break;//空格*/ default : break;}GICR |= (1 << INT0); //使能外部中断INT0sei();}#ifndef __ds18b20__H#define __ds18b20__H#include <avr/io.h>#include <util/delay.h>#include <avr/interrupt.h>#define uchar unsigned char#define uint unsigned int#define CLR_DIR_1WIRE DDRC &= ~(1<<PC6)//不再变化#define SET_DIR_1WIRE DDRC |= (1<<PC6) //IO改为输入口,高阻态,外部上拉电阻拉高#define SET_OP_1WIRE PORTC|= (1<<PC6) //改为输出口,输出低电平#define CLR_OP_1WIRE PORTC &=~(1<<PC6)#define CHECK_IP_1WIRE ( PINC & 0x40)void init_1820(void);void write_1820(unsigned char x);unsigned char read_1820(void);void gettemp(void);volatile uint Temperature;volatile unsigned char temh,teml;volatile uchar Num[4];void init_1820(void){SET_DIR_1WIRE; //设置PA0 为输出 SET_OP_1WIRE; //输出1CLR_OP_1WIRE; //输出0_delay_us(480); //480us以上SET_OP_1WIRE; //输出1CLR_DIR_1WIRE; //设置PA0 为输入 _delay_us(20); //15~60uswhile(CHECK_IP_1WIRE);SET_DIR_1WIRE;SET_OP_1WIRE;_delay_us(140); //60~240ussei();}void write_1820(unsigned char x){unsigned char m;for(m=0;m<8;m++){CLR_OP_1WIRE;if(x&(1<<m)) //写数据了,先写低位的! SET_OP_1WIRE;else{CLR_OP_1WIRE;}_delay_us(40); //15~60usSET_OP_1WIRE;}SET_OP_1WIRE;}unsigned char read_1820(void){unsigned char temp,k,n;temp=0;for(n=0;n<8;n++){CLR_OP_1WIRE;SET_OP_1WIRE;CLR_DIR_1WIRE;k=(CHECK_IP_1WIRE); //读数据,从低位开始 if(k)temp|=(1<<n);elsetemp&=~(1<<n);_delay_us(50); //60~120usSET_DIR_1WIRE;}return (temp);}void gettemp(void) //读取温度值{cli();init_1820(); //复位18b20write_1820(0xcc); // 发出转换命令write_1820(0x44);//_delay_ms(10); //不延时也好使,不知道怎么回事! init_1820();write_1820(0xcc); //发出读命令write_1820(0xbe);teml=read_1820(); //读数据temh=read_1820();sei();}#endif。
下面是我写的一个实现多个下位机(单片机)与一个上位机(PC机)的一主多从串口通讯程序,用的STC89C52RC,定时器2做串口通信波特率发生器。
实现功能是这样的:用调试助手向单片机发送一个数据包。
通讯协议是这样的:数据包的格式如下所示(共10个字节组成):0x2A,0xEB,0x8D,地址码,指令码,数据长度码,数据码,数据码,校验码,0xAD前面三个字节为帧头,即开始符。
地址码:欲传送的目的地址,即选定哪一个单片机。
指令码:向单片机发送的指令数据长度码:用于指示后面有效数据的个数数据码:传送的数据,配合指令码的纯数据。
校验码:累加和校验,对地址码,指令码,数据长度码,数据码进行累加,用来检验数据的完整性和正确性。
0xAD :帧尾,即结束符。
本程序实现功能是这样的:用调试助手向单片机发送一个数据包,单片机收到后对数据解析,再回传指定的数据。
例如发送:2a eb 8d 01 03 01 01 06 ad指令码为01,单片机接收到后解析,回传0xce 0x7b 0x11 0xed。
其中前两个字节为开始符,最后一个字节为结束符。
同理,若收到的指令码为02,回传0xce 0x7b 0x12 0xed。
以此模拟控制单片机操作。
若接收错误,即累加校验码不等于单片机实际计算的累加和,回传0xce 0x7b 0x02 0xed,提示接收错误,要求PC重发数据(模拟,需要上位机软件配合才行)。
单片机开机初始化后即向PC发送一个数据0xce 0x7b 0x00 0xed,用于指示单片机与PC通信已连接。
下面是程序:#define ID 0x01 //单片机地址uint8 rec_data; //串口通信接收数据uint8 state_flag=0; //通信协议解析状态标志,初始化为0uint8 retval=0; //通信协议解析函数返回值,初始化为0uint8 cmd; //指令码uint8 Data[2]; //数据码uint8 data_count; //数据长度码程序大体思想是:首先定义了几个全局变量,接收到数据后,串口中断子程序中用变量rec_data存储一个字节的数据,随后对数据进行解析:首先判断数据包的完整性,正确性,然后提取指令码,数据码等数据,存放起来用于主程序处理。
组态王与单片机多机串口通信的设计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直接连接,需要电气转换。
单片机多机通信代码单片机多机通信是指通过单片机实现多个设备之间的数据传输和通信。
在现代的智能家居系统、工业自动化系统以及物联网等领域,单片机多机通信扮演着重要的角色。
为了实现单片机多机通信,需要首先确定通信的方式和协议。
常见的通信方式包括串口通信、SPI通信、I2C通信等。
在选择通信方式时,需要考虑设备之间的距离、通信速率、通信复杂度等因素。
协议方面,可以使用现有的通信协议,如Modbus、CAN、TCP/IP等,也可以根据具体需求自定义通信协议。
在单片机多机通信的实现过程中,首先需要配置单片机的通信接口。
例如,在使用串口通信时,需要设置波特率、数据位数、停止位数等参数。
接下来,需要编写相应的程序代码来实现数据的发送和接收。
发送数据时,可以使用单片机的串口发送函数将数据发送给其他设备;接收数据时,则需要使用单片机的串口接收函数来接收其他设备发送的数据。
在多机通信中,一台设备可以充当主机,负责控制其他设备的工作,也可以充当从机,接收主机发送的指令并执行相应的操作。
主机和从机之间可以通过发送和接收数据来实现通信。
例如,在智能家居系统中,主机可以控制灯光的开关、温度的调节等操作,而从机则负责接收主机发送的指令并执行相应的操作。
在实际应用中,单片机多机通信可以实现设备之间的信息交互和协同工作。
例如,在工业自动化系统中,可以通过多机通信实现各个设备之间的数据共享和协作,提高生产效率和质量。
在物联网中,可以通过多机通信实现各个物联设备之间的联动和互联,实现智能化控制和管理。
单片机多机通信是一种重要的通信方式,可以实现设备之间的数据传输和通信。
通过合理选择通信方式和协议,并编写相应的程序代码,可以实现设备之间的信息交互和协同工作,从而提高系统的功能和性能。
单片机与MCGS多机通讯的实现
作者:赵明
来源:《中国新通信》2013年第11期
【摘要】利用MCGS工业触摸屏实现远程电话控制家用电器、报警服务。
界面友好,通讯稳定,可以实时查看本地家用电器控制情况。
并且与PC机进行通讯,MCGS中的控制过程,控制结果,报警信息同时实时传送到电脑PC端。
整个系统通用性好,可以依据实际情况实现控制其他电气设施。
【关键词】MCGS组态软件M51单片机
一、通讯系统软件设计
1.前言。
电话远程智能控制系统实现当用户离开用电设备时,依然可以远程通过电话手机遥控家里的用电设备。
对被控对象进行实时监控,对家电进行全方位实时管理。
同时通过双上位机人性化的监控界面。
上位机通过MCGS组态软件编程对下位机进行监控,在本设计中它与下位机的通信端口为COM1。
2.MCGS与单片机的通讯。
MCGS是目前较常见的一种工业控制通用组态软件,可以利用它十分方便地构成了分布式系统的监控画面,动态显示控制设备的运行状态、实时、历时曲线和报表、上下限报警等。
他是一套基于Windows平台的,为工业过程控制和实时监控服务的32位全中文界面组态软件系统。
为了与现场设备进行交互,它提供了国内外各种常用的工控设备的驱动程序,但基本上是与PLC,DSP等设备的数据交互通讯。
如果用MCGS与单片机实现实时通讯,则需要利用MCGS驱动开发工具对某一具体的通讯协议进行单独的开发。
设计者只需要经过简单的参数设定,输入,就可以编程出为自己项目所用的独立的dll构件。
MCGS用Active DLL构件的方式来实现设备驱动程序,通过规范的OLE接口挂接到MCGS中,使其构成一个整体,所以MCGS把设备驱动程序叫做设备驱动构件。
MCGS设备构件的实现方法和原理与标准VB的ActiveDLL完全一致,但MCGS规定了一套接口规范,只有遵守这些接口规范的ActiveDLL才能用作MCGS的设备驱动构件。
它必须具有如下5个属性和8个方法:
用户根据自己的协议要求编写成功dll构件之后,在MCGS开发环境中打开串口父设备,添加做好的电话远程控制的dll构件。
二、硬件电路设计
本设计硬件部分主要是由两部分组成。
外线DTMF双音频码译码电路和家用电器控制电路。
其中主要部分是DTMF译码电路。
该电路由MT8880作为DTMF译码芯片,由AT89C52
接收MT8880的D0~D3引脚采集的16进制码,将所得到的码反映到相对应的引脚上,从而控制不同的用电设备。
三、程序设计
程序设计是本系统的重要部分,主要包括两部分。
一是单片机分析8880数据进而反映到IO口,控制不同的家用电器(继电器);二是MCGS在PC端的软件开发。
1.单片机程序设计。
本系统选用AT89C51单片机作为主要控制芯片,当INT1引脚接收到电平变化信息后,利用单片机中断接口填写接收外部电话控制码的程序内容,即MT8880的
D0~D3的并口数据。
如果接收完整,则在单片机的P0相应引脚上进行反向操作,进而控制相应的家用电器。
控制完成后,单片机利用串口通信向MCGS发送控制完成数据。
2.MCGS程序设计。
MCGS作为双上位机其中一个,当接收到单片机发送过来的控制家电完成的数据后,运用动画直观的显示哪一台用电设备已经开启,并储存控制过程及控制发生时间。
用于以后随时查询。
MCGS在程序编写的时候注意添加串口父设备时每一个参数必须和单片机发送的参数格式内容保持一致,起始位结束位完全相同。
接收的每一帧数据保存到实时数据库中。