Modbus协议下51系列单片机与eView触摸屏的通讯方法
51单片机与力控modbus通信

网上关于单片机和力控modbus通信的实例很少,关键并不是modbus协议而是力控与单片机连接的设置,下面的程序是基于51单片机做的。
在正个调试过程中由于我们不清楚力控发送给单片机的请求数据格式,我们可以用串口调试工具进行串口调试,将力控发送请求显示在串口调试工具中,其中单片机的程序如下#include<reg52.h>#include<string.h>#define uchar unsigned char //一个字节#define uint unsigned int // 两个字节void send_char(unsigned char txd);uint rece_count=0;uint send_flag=0;uchar rece_buf[8]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};uint i;/*串行口初始化*/void chushi(){SCON=0x50; //串口工作方式1,即10位异步PCON=0x00;//波特率不倍增TMOD=0x20;TH1=TL1=0xfa;TR1=1;}/*主程序*/main(){chushi();rece_count=0;while(1){if(RI){RI=0;if(rece_count<8){rece_buf[rece_count]=SBUF;rece_count++;}}if(rece_count==8){send_flag=1;}while(send_flag==1){ for(i=0;i<8;i++){SBUF=rece_buf[i];while(TI==0) ;TI=0;}}}}打开力控运行,将发送的数据保存到单片机中,然后打开串口调试工具,显示如下:我们看力控发送请求的格式:01 03 ff ff 00 01 84 2e,最后的两位crc是高位在前,低位在后。
基于MODBUS协议的单片机与触摸屏通信_金杰

在工业控制中经常需要观察系统的运行状态或者修改运行参数。
触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。
单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。
触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。
Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。
本文以AT89S51单片机和威纶通科技有限公司的MT6070iH型触摸屏为例,介绍其通信程序的开发过程。
一、系统结构实现触摸屏与单片机的通讯,主要是解决通讯协议的问题。
本文使用开放的Modbus通讯协议,以触摸屏作主机(M aster),单片机作从机(Slaver)。
MT6070iH触摸屏本身支持Modbus通讯协议,只要单片机按照Modbus协议进行收发数据,就可以进行通信了。
触摸屏与单片机之间采用RS-485标准接口直接连接,传输速率设置为9600bps。
图1为该系统的电路图。
图1系统电路图将AT89S51单片机的TXD、RXD口设置为异步串行通信模式,经过MAX485芯片将TTL电平转换为RS485电平,再与MT6070iH触摸屏RS-4852W接口相连,即完成了硬件连接,其中P3.2作为收发控制信号。
MT6070iH触摸屏RS-4852W接口的管脚2为485A,管脚1为485B,管脚5为公共地。
二、如何将MT6070iH设定成Modbus装置图2将MT6070iH设定成M odbus装置将MT6070iH触摸屏设定成Modbus装置(以称为M odbus Server),单片机或其它装置只需使用M odbus协议,透过RS232/485接口,即可读写M T6070iH上的数据。
将MT6070iH设定成Modbus装置的方法如下:首先需在MT6070iH使用的MTP程序的设备清单(device table)中增加一个新的设备,此时PLC种类需选择“MODBUS Server”,PLC接口可以选择RS232、RS4852W、RS4854W或Ethernet,这里选择RS4852W。
51单片机新手入门之Modbus通讯

51单片机新手入门之Modbus通讯本文和另一篇----C# WPF新手入门之Modbus通讯为一个系列,所用模块均是气体分析模块,之前用C3做的上位机(主要是方便调试,单片机不好搞),既然电脑上串口通讯代码没问题,那么放到单片机稍加修改也就理所当然肯定可行O(∩_∩)O~。
本文包括单片机的电路设计和软件设计两部分(单片机采用STC12C5A60S2双串口),至此单片机和上位机的串口通讯均成功实现,供需要的同学参考。
1.电路设计Altium Designer原理图如下:电源部分:24V转5V及6VAD及滤波Modbus通讯电脑串口通讯lcd屏显示预留接口,可以另接MAX232用来调试发送给模块数据正确性实际效果如下:电脑串口接收到的数据,和LCD 屏显示的是一样的下载步骤1. 选择芯片下载步骤2. 打开串口 下载步骤3. 打开hex 文件 下载步骤4. MCU 先断电,点击下载,看到提示后上电2.软件设计这里最麻烦的在于模块的Modbus通讯需要偶校验,我是手动添加的校验位,例如字符‘0’换成ASCII码0X30,添加偶校验后就是0X3A,把所有需要发送的数据一个个手动添加了再发送^_^;另外lcd12864屏也搞半天,主要照着时序图写必须sid先发送,然后sclk,不然不行 ̄□ ̄。
气体模块详细的通讯协议参考和上位机通讯那篇,此处不再介绍。
图中电路板没有焊AD芯片和温度芯片,引脚备用,相关代码注释掉了。
代码如下:#include "STC12C5A60S2.H"#include <intrins.H>.//头文件#define uchar unsigned char#define uint unsigned intuchar sendbuffer[17];//发送数据uchar flag=0;uchar re_buffer[32];uchar count=0;uint ad_data=0;double ad_vol=0;uint con_mid=0;uint gascon=0;long sum_o2=0;uint average_counter=20;uint idata oldtemp[21];uchar idata Send_Buff[20]; //moduleuint pre_contemp=0;uint O2_con=0;uchar idata test[21]; //moduleuint temperature=0;uint dat;uint testlcd=0;uchar c[]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9};//MAX1241 模数芯片引脚设置,此电路板我没焊^_^//sbit ADC_CS=P0^1;//sbit ADC_CLK=P0^0;//sbit ADC_DOUT=P0^2;sbit ADC_CS=P3^6;sbit ADC_CLK=P3^5;sbit ADC_DOUT=P3^7;//LCD12864 LCD屏幕引脚设置sbit cs=P2^2;sbit sid=P2^1;sbit sclk=P2^0;sbit DQ=P0^1; //DS18B20 温度引脚设置,依然没有…#define N 11#define N2 20void delayms(unsigned char t){unsigned char i;unsigned char j;for(j=t;j;j--)for(i=192;i;i--);/*1ms延时*/}void delayus(uint t){uint i;for(i=0;i<t;i++){_nop_();}}void delay(float sec){unsigned int i;unsigned int j;j=sec*100;while(j--){i=1561;while(--i);}}void UART1_init() //串口1初始化,此串口和电脑通讯{TMOD=0x20;/设置定时器工作方式2TH1=0xfd; //波特率9600TL1=0xfd;TR1=1;REN=1;SM0=0;SM1=1;//ES=1;}void UART2_init()//串口2初始化,和模块通讯 Modbus{S2CON= 0x50; //方式1,允许接收BRT = 0xf4; //波特率2400AUXR = AUXR |0X10; //允许独立波特率允许AUXR1 = AUXR1&0xef; //将uart2切换到P1口IE2 = IE2|0X01; //允许串口2中断}void UART1_Send (unsigned char UART_data)//{//ES=0;SBUF = UART_data; //将接收的数据发送回去while(TI!=1); //检查发送中断标志位TI = 0; //另发送中断标志位为0//ES=1;}void UART2_Send(unsigned char UART_data)//串口2发送{//ES = 0 ;S2BUF = UART_data;while((S2CON&0x02)!=0x02);S2CON &= ~0x02;//ES = 1 ;}void UART1_Send_String (char *str, char len)//串口1发送字符串{unsigned char i;for(i=0;i<=len;i++){UART1_Send(str[i]);}}void UART2_Send_String (char *str, char len) //串口2发送字符串{unsigned char i;for(i=0;i<=len;i++){UART2_Send(str[i]);}}unsigned char Creat_Addr(unsigned char adr, unsigned char position)//计算模块地址{unsigned char hich;unsigned char loch;hich = adr/16;loch = adr%16;if(hich>9)hich+=7;if(loch>9)loch+=7;if(position == 1){return hich+0x30;}else if(position == 0){return loch+0x30;}}unsigned char CheckSum(unsigned char *str, unsigned char position, uchar len)/计算校验码{uchar i;unsigned int sum=0;uchar hi, lo;//uchar len = 12;for(i = 1; i <= len; i ++){*str ++;sum += *str;}sum = 256-(sum%256);hi = sum/16;lo = sum%16;if(hi > 9)hi += 7;if(lo > 9)lo += 7;hi += 0x30;lo += 0x30;if(sum == 256)hi = lo = 0x30;if(position == 1){return hi;}else if(position == 0){return lo;}}void data_init(){sendbuffer[0]=0x5B;sendbuffer[1]=0x30;sendbuffer[2]=0x30;sendbuffer[3]=0x30;sendbuffer[4]=0x30;sendbuffer[5]=0x30;sendbuffer[6]=0x7C;sendbuffer[7]=0x30;sendbuffer[8]=0x30;sendbuffer[9]=0x30;sendbuffer[10]=0x30;sendbuffer[11]=0x30;//TEMsendbuffer[12]=0x30;sendbuffer[13]=0x30;sendbuffer[14]=0x5D;sendbuffer[15]=0x0D;sendbuffer[16]=0x0A;}void calculate_module(unsigned char str[])//lcd屏显示{unsigned int concen;uchar wan,qian,bai,shi,ge;/*uchar d4 = str[7]-48;uchar d3 = str[8]-48;uchar d2 = str[9]-48;uchar d1 = str[10]-48;*/ //浓度只需要后面部分 uchar d4 = str[24]-48;uchar d3 = str[25]-48;uchar d2 = str[26]-48;uchar d1 = str[27]-48;if(d4>9)d4-=7;if(d3>9)d3-=7;if(d2>9)d2-=7;if(d1>9)d1-=7;concen = d4*4096+d3*256+d2*16+d1;gascon=concen;wan=concen/10000;qian=concen%10000/1000;bai=concen%1000/100;shi=concen%100/10;ge=concen%10;//sendbuffer[6]=wan+0x30; //最终显示XXX.X%sendbuffer[7]=qian+0x30;sendbuffer[8]=bai+0x30;sendbuffer[9]=shi+0x30;sendbuffer[10]=ge+0x30;}void module_init()//气体模块初始化{Send_Buff[0] = ':';Send_Buff[3] = '0';Send_Buff[4] = '3';Send_Buff[5] = '0';Send_Buff[6] = '0';Send_Buff[7] = '0';Send_Buff[8] = 'A';Send_Buff[9] = '0';Send_Buff[10] = '0';Send_Buff[11] = '0';Send_Buff[12] = '1';Send_Buff[1] = Creat_Addr(31, 1);Send_Buff[2] = Creat_Addr(31, 0);Send_Buff[13] = CheckSum(Send_Buff, 1, 12);Send_Buff[14] = CheckSum(Send_Buff, 0, 12);Send_Buff[15] = 0x0D;Send_Buff[16] = 0x0A;//手动添加校验,例如字符‘0’换成ASCII码0X30,添加偶校验后就是0X3A,最终发送给模块的以下数据,地址被写死,这个不像C#做的一目了然O(∩_∩)Otest[0]=0X3A;test[1]=0XB1;test[2]=0XC6;test[3]=0X30;test[4]=0X33;test[5]=0X30;test[6]=0X30;test[7]=0X30;test[8]=0X41;test[9]=0X30;test[10]=0X30;test[11]=0X30;test[12]=0XB1;test[13]=0X39;test[14]=0XB4;test[15]=0X8D;test[16]=0X0A;}/*uint read_max1241() AD芯片处理{uint ADC_Data;uchar i;ADC_CLK=0;ADC_CS=0;ADC_Data=0;while(!ADC_DOUT);ADC_CLK=1;ADC_CLK=0;for(i=0;i<12;i++){ADC_CLK=1;ADC_Data<<=1;ADC_Data |= ADC_DOUT;ADC_CLK=0;}ADC_CS=1;ADC_CLK=0;return ADC_Data;}unsigned int ad_filter()//滤波{unsigned int count1,i,j;unsigned int value_buf[N];unsigned int temp;unsigned int sum=0;for (count1=0;count1<N;count1++){value_buf[count1] =read_max1241(); delayms(20);}for (j=0;j<(N-1);j++){for (i=0;i<(N-j);i++){if ( value_buf[i]>value_buf[i+1] ) {temp = value_buf[i];value_buf[i] = value_buf[i+1]; value_buf[i+1] = temp;}}}for(count1=3;count1<(N-3);count1++){sum += value_buf[count1];}return (unsigned int)(sum/(N-6));}void calculate_o2()//测试用{uchar wan,qian,bai,shi,ge;uint con_fin=0;uchar i;ad_data=ad_filter();ad_vol=(ad_data/4096.0)*2500.0;//Voltage ad_data=(uint)ad_vol; //concentrationdelayms(2);if(average_counter>0){sum_o2+= ad_data;oldtemp[average_counter-1]=ad_data;average_counter--;}else{sum_o2 -=oldtemp[19];for(i=20;i>0;i--){oldtemp[i]=oldtemp[i-1];}oldtemp[0]=ad_data;sum_o2+=oldtemp[0];con_fin=(uint)(sum_o2/N2);//O2_con=0.8*con_fin+0.2*pre_contemp;//pre_contemp=O2_con;wan=con_fin/10000;qian=con_fin%10000/1000;bai=con_fin%1000/100;shi=con_fin%100/10;ge=con_fin%10;sendbuffer[1]=wan+0x30;sendbuffer[2]=qian+0x30;sendbuffer[3]=bai+0x30;sendbuffer[4]=shi+0x30;sendbuffer[5]=ge+0x30;delayms(5);}}//-------------18B20 温度显示复位函数--------------- void ow_reset(void){char presence=1;while(presence){while(presence){DQ=1;delayus(2);DQ=0; //delayus(550); // 550usDQ=1; //delayus(66); // 66uspresence=DQ;}delayus(500); //延时500uspresence = ~DQ;}DQ=1;}//-----------18B20写命令函数------------void write_byte(uchar val){uchar i;for (i=8; i>0; i--) //{DQ=1;delayus(2);DQ = 0;delayus(5);//5usDQ = val&0x01;delayus(66); //66usval=val/2;}DQ = 1;delayus(11);}//--------------18B20读一个字节函数---------uchar read_byte(void){uchar i;uchar value = 0;for (i=8;i>0;i--){DQ=1;delayus(2);value>>=1;DQ = 0;delayus(4); //4usDQ = 1;delayus(4); //4usif(DQ)value|=0x80;delayus(66); //66us}DQ=1;return(value);}void Read_Temperature(void){unsigned int Temp1,Temp2;uchar bai,shi,ge;ow_reset(); //DS18B20write_byte(0xCC);write_byte(0x44);ow_reset(); //DS1302复位write_byte(0xCC);write_byte(0xbe);Temp1=read_byte();Temp2=read_byte();ow_reset();temperature=(((Temp2<<8)|Temp1)*0.625); //0.0625=xx, 0.625=xx.x, 6.25=xx.xxbai=temperature/100;shi=temperature%100/10;ge=temperature%10;sendbuffer[11]=bai+0x30;sendbuffer[12]=shi+0x30;sendbuffer[13]=ge+0x30;delayms(5);}* //图中电路板此部分没焊,此部分代码不使用^_^void writecmd_lcd(uchar cmd) //lcd屏写指令{uchar i;uchar cmd1;cmd1=cmd;//----------先写控制,选择写指令,还是写数据11111000 for(i=0;i<5;i++) //必须sid先发送,然后sclk,不然不行 {sid=1;sclk=1;sclk=0;}for(i=0;i<3;i++){sid=0;sclk=1;sclk=0;}//delayms(10);cmd=cmd&0xf0; //先高4位for(i=0;i<8;i++){if(cmd&0x80){sid=1;}else sid=0;sclk=1;sclk=0;cmd=cmd<<1;}//delayms(10);cmd1=((cmd1<<4)&0xf0); //低4位 for(i=0;i<8;i++){if(cmd1&0x80){sid=1;}else sid=0;sclk=1;sclk=0;cmd1=cmd1<<1;}}void writedata_lcd(uchar dat) {uchar i;uchar dat1;dat1=dat;//11111010for(i=0;i<5;i++){sid=1;sclk=1;sclk=0;}sid=0;sclk=1;sclk=0;sid=1;sclk=1;sclk=0;sid=0;sclk=1;sclk=0;//delayms(10);dat=dat&0xf0;for(i=0;i<8;i++)if(dat&0x80){sid=1;}else sid=0;sclk=1;sclk=0;dat=dat<<1;}//delayms(10);dat1=((dat1<<4)&0xf0);for(i=0;i<8;i++){if(dat1&0x80){sid=1;}else sid=0;sclk=1;sclk=0;dat1=dat1<<1;}}void init_lcd()//初始化lcd屏{cs=1;writecmd_lcd(0x30);//设定为8位控制writecmd_lcd(0x0c);//显示打开writecmd_lcd(0x01);//清屏}void gotoxy(uint row, uint col){switch(row){case 1: writecmd_lcd(0x80+col);break; case 2: writecmd_lcd(0x90+col);break; case 3: writecmd_lcd(0x88+col);break; case 4: writecmd_lcd(0x98+col);break;}void clear(){writecmd_lcd(0x01);delayms(10);}void SendStr(uchar *str){uchar i;for(i=0;str[i]!='\0';i++){writedata_lcd(str[i]);}}void lcd_display(uint lcddata)//lcd屏显示浓度{uchar wan,qian,bai,shi,ge;wan=lcddata/10000;qian=lcddata%10000/1000;bai=lcddata%1000/100;shi=lcddata%100/10;ge=lcddata%10;gotoxy(2,1);writedata_lcd(0xa3);writedata_lcd(c[qian]);gotoxy(2,2);writedata_lcd(0xa3);writedata_lcd(c[bai]);gotoxy(2,3);writedata_lcd(0xa3);writedata_lcd(c[shi]);gotoxy(2,4);SendStr(".");gotoxy(2,5);writedata_lcd(0xa3);writedata_lcd(c[ge]);gotoxy(2,6);SendStr("%");}void main()//主函数{delay(2.1);UART1_init();UART2_init();data_init();module_init();init_lcd();EA=1;delay(2.1);while(1){/*calculate_o2();//测试用Read_Temperature();*/ //温度芯片没焊UART2_Send_String(test,16);//串口2:和模块通讯delay(0.8);if(flag==1){calculate_module(re_buffer);delayms(5);UART1_Send_String(sendbuffer,16);//串口1:电脑上可以接收发送的数据 flag=0;delay(0.8);}lcd_display(gascon);//lcd显示浓度delay(0.8);}}/*void uart1_in() interrupt 4/串口1中断,不使用,因为只是发送{RI=0;re_buffer[count]=SBUF;if(re_buffer[0]!=':'){count=0;}else{count++;if(count==10){flag=1;count=0;}}}*/void uart2_in() interrupt 8//串口2中断,需要接受模块返回的数据{if(S2CON&0X01){re_buffer[count]=S2BUF;re_buffer[count]&=0x7f;count++;S2CON&=0XFE;}if(count==32){count=0;flag=1;}}。
基于MODBUS协议的医院病房环境监控系统的设计

基于MODBUS协议的医院病房环境监控系统的设计丁晓迪【摘要】提出了一种基于MODBUS协议的医院病房环境监控系统的硬件和软件实现方法,其以基于Modbus协议的AT98S51单片机与eViewMT5600T型触摸屏为核心器件构建成了一套完整的病房环境的监控系统,分别利用传感器MQ-2、DS18B20、HF3223对病房内的温度、湿度和火灾情况进行预警,并可通过触摸屏开关相应设备进行控制.%This paper presented a set of MODBUS protocol on hospital ward environment monitoring system hardware and software implementations,the Modbus protocol-based microcontroller with eView MT5600T AT98S51-type touch screen device built into the core of a compl 【期刊名称】《佳木斯大学学报(自然科学版)》【年(卷),期】2011(029)004【总页数】4页(P541-543,546)【关键词】MODBUS;单片机;环境监控;eView;MT5600T【作者】丁晓迪【作者单位】佳木斯大学,黑龙江佳木斯154007【正文语种】中文【中图分类】TP273.50 引言随着信息化的高度发展,医院病房内环境的安全性、舒适性被越来越重视,对环境数据监控的智能化和人性化需求大大增加.本文所设计的系统结合了传感器技术、触摸屏、单片机控制等多种技术,采用较为成熟的技术和方案,可以有效的对医院病房内的各种环境数据加以采集分析,并可以通过触摸屏加以控制,同时其具有很好的可移植性和稳定性,经过相应的改造后可以应用于多种场所,具有很重要的现实意义[1].1 系统的基本结构本系统由病房环境检测、综合分析、集中控制三部分构成.使用高性能传感器.应用开放式的Modbus通讯协议,以触摸屏作主设备,单片机作从设备进行开发.系统结构图如图1所示.病房环境检测层由多路传感器组成,包括MQ-2型烟雾传感器、温度传感器DS18B20、湿度传感器HF3223等.病房环境检测部分的主要功能是采集和获取病房内部环境情况数据,将烟雾气体、温度、湿度转变成为电信号,通过TLC1543将模拟电信号转变成为11路10位数字信号供综合分析分部使用.综合分析部分的主要功能是接收传感器所采集的信号,通过AT89S51的处理,按图形及文本方式在触摸屏上显示各病房的温湿度与历史数据.集中控制部分由触摸屏作为输入控制设备,单片机连接空气调节器,对病房内空气的温湿度、空气流速以及清洁程度进行调节,以满足病人对环境的特殊需求.病房适宜的温度冬季为18~22℃,夏季19~24℃,相对湿度为50% ~60%.2 病房环境检测系统2.1 温度检测电路温度检测电路的核心是温度传感器DS18B20.DS18B20依靠一个单线端口通讯.在单线端口条件下,必须先建立 ROM操作协议,才能进行存储器和控制操作.其又是单总线器件,与控制器的连接只需一根线即可,但需在此信号线上加上上拉电阻.使用三个DS18B20测温芯片,多芯片单总线进行操作时,可采用4.7K的上拉电阻[2].2.2 湿度检测电路对于湿度的检测采用HF3223传感器,电路结构与图2类似.HF3223是一个频率输出的湿度传感器模块,与控制器的连接时只需将其输出信号线与单片机的 I/O 口直接相连即可[3].单片机在采集时使用定时器的计数器功能,对获取的脉冲个数进行计数,最终获得频率.再根据频率湿度转换的法则将频率转换成湿度信息[3].2.3 烟雾检测电路烟雾检测电路的核心是MQ-2型烟雾传感器.MQ-2型烟雾传感器的内部结构由微型Al2O3陶瓷管、SnO2敏感层、测量电极和加热器构成的敏感元件固定在塑料构成的腔体内,加热器为气敏原件提供必要的工作条件[4].MQ-2有6个针状管脚,其中4个用于信号提取,2个用于提供加热电流.本系统中被测气体量非常微弱,应使用电桥电路来测量这种微弱的变化.电桥电路的作用就是将电阻变化率转化成电压输出,然后提供给放大电路,放大后进行测量.系统采用仪用放大器AD620.其具有高共模抑制比,同时能简化设计难度.图1 系统总体结构图2.4 报警电路病房内发生火灾发生时,将一氧化碳、二氧化碳等气体,当烟雾检测电路检测到空气中系统将立即启动报警装置.该装置的声、光报警电路分别分别由单片机P3.5和P3.4控制.声音报警使用蜂鸣器,光报警使用发光二极管.当可燃气体浓度达到相应报警要求时,单片机P3.5或P3.4输出高电平,三极管T1或T2导通,报警电路发出声光报警.3 综合分析系统综合分析部分接收由多路传感器提取到的温度、湿度、气体信号,由单片机对以上信号进行处理和分析,利用Modbus协议,将它们传输到eView MT5600T进行显示,同时控制空调对室内温度和湿度进行调控.Modbus协议是OSI模型第七层上的应用层文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信.协议中定义了消息、格式和内容的公共格式,采用命令/应答方式工作.在Modbus系统中有两种有效的传递模式即ASCII和RTU模式.基于RTU模式传输位数少,使用方便的特点,设计采用RTU模式进行传输.网络里仅有一台设备可作为主机(称Master),其它设备作为从机(称Slaver),主机不需编号,从机必须编号.主从机之间信息通过异步方式传输,并以字节为单位.A/D转换采用TLC1543芯片.其共有11路(A0—A10)10位A/D信号输入,本系统选用三路A0、A1、A2.芯片的 CLOCK、DIN、DOUT、CS 分别与单片机I/O口相连.D/A转换采用TLC5615芯片.其有一路10位D/A信号输出,通过软件设置能够输出两倍的基准电压.芯片的DIN、SCLK、CS与单片机的I/O引脚相连.上位机即人机交互界面,其主要负责提供一个人机交互环境,按设计要求,上位机应支持Modbus通讯协议,并且具有相应的通信接口,此处选择eView的MT5620T触摸屏,并采用RS232串口进行直连.eView的MT5620T触摸屏是集成触摸式显示屏,系统上位机为MT5620T触摸屏,启动机器首先对触摸屏进行初始化设置,在设定好事实通信数据格式,生成相应的校验码后建立与下位机的通讯联系,并进入待机状态,当有数据传入时,将数据转化成相应的数字加以处理和显示,当数据超过预设值时,可显示报警信息并可通过触摸屏进行反馈控制.由于监控系统的实时性,该流程循环进行[5].下位机采用AT89S51单片机作为下位机主要芯片,用来采集病房环境信息和控制外围器件来实现对病房的环境监控.传感器和电机在经过相应的A/D、D/A转换后,连接单片机的相应的I/O接口,并通过串口来连接上位机.启动机器时,系统首先对单片机和各个传感器都进行初始化设置,传感器开始工作,单片机等待接收传感器信号,当有信号传入时,通过串口将数据传送给上位机加以显示和处理,同时再次进入等待状态.以温度控制为例,程序设计流程如图3所示,湿度等其他量监控流程与之类似.图2 综合分析系统温度调节流程图4 集中控制系统集中控制系统负责接受外部环境信息并执行控制人员命令,控制外围设备的运行.显示与控制命令相对应的图形界面.负责系统的控制信号输出.包括多种开关器件的打开和关闭、报警信号的动作等.5 结论本文提出了一种基于MODBUS协议的医院病房环境监控系统,并从硬件和软件两个方面介绍了系统的相关技术要点和设计过程,实现了对病房内环境的实时和有效的监控,并加以正确显示.设计采用了MT5620T触摸屏模块和单片机控制,从而简化了电路的结构,使得系统更加直观和便于操作,突破了传统环境监测仪器使用复杂的不变,更加适应了现代医疗监护系统的需要,具有较强的实用性.参考文献:[1]宁欣,苗青林.基于单片机的环境监测系统设计[J].河南科技学院学报,2008,36(4).[2]周梅,廖承虎.基于AT89C51的多路温度检测报警系统[J].电子测量技术,2008,31(9).[3]居敏花.基于AT89S52的温湿度检测系统的设计[J].山西电子技术,2009.3.[4]费红波,吉锤.可燃气体报警器及其检测标定系统的设计[J].江苏现代计量,2010.1.[5]李明伟,郭广峰.PIC单片机与触摸屏串行通信的MODBUS协议实现[J].自动化与仪器仪表,2005.9.。
OMRONPLCEView触摸屏编程使用说明书

OMRONPLCEView触摸屏编程使用说明书DMP-300F型中小型水电站触摸式机组自动化屏(OMRON PLC +EView 触摸屏)编程使用说明书文件编号:HN/QF.13-0002-004版本号: A发放编号:持册人:长沙华能自控集团目录1.OMRON CJ1M系列PLC介绍 (2)1.1.CPU单元(使用CJ1M-CPU13) (2)1.2.通信单元(使用CJ1W-SCU41) (8)1.3.I/O单元 (8)1.4.模块安装及地址分配 (8)2.OMRON PLC常用编程指令 (9)2.1. 梯形图指令 (9)2.2. 位元(B IT)操纵指令 (9)2.3. 终止指令(END) (10)2.4. 定时器和计数器指令 (10)2.5. 数据移位元元元指令 (10)2.6. 数据传送指令 (11)2.7. 数据比较指令 (12)2.8. 数据转换指令 (13)2.9. BCD码运算指令 (14)2.10. 二进制元运算指令 (16)2.11. 逻辑指令 (17)2.12. 子程序和中断操纵指令 (18)2.13. 串行通信指令(PMCR) (19)3.OMRON PLC程序编辑软件 (19)3.1. CX-P ROGRAMMER中对PLC的初始化设置 (19)3.2. PLC设定 (20)3.3. CX-P ROGRAMMER中对PLC的联机操作 (20)3.4. 程序中各个子程序的用途定义 (21)4.OMRON PLC通信程序编辑软件 (21)4.1. 与PLC通信单元箱地址设定 (22)4.2. 4-2PLC协议编制软件(CX-P ROTOCOL)通信口设定 (22)4.3. PLC协议编制软件使用简单说明 (22)4.4. PLC与单元箱通信协议注意事项: (23)5.EASYVIEW触摸屏程序编辑软件 (23)5.1. 与OMRON PLC连接参数设定 (23)5.2. 一样参数设定(通过“编辑――系统参数的一样页进行设定) (23)5.3. 组件功能说明 (24)5.4. 触摸屏程序的下载 (27)5.5. 触摸屏程序调试 (27)6.水机屏PLC程序资料寄存器分配 (28)6.1. PLC内部时钟存放区(D0~D6) (28)6.2. PLC事故资料中转区(D10~D19) (28)6.3. 发生的水机操作、故障、事故报警个数存放区(D20): (28)6.4. 水机状态(遥信量)存放区(D21~D30): (28)6.5. PLC事故存放区:(D4000~D5999)共存放200条事故资料 (29)6.6. PLC与单元箱通信辅助中间寄存器: (29)6.7. PLC与单元通信中断判定辅助寄存器: (29)6.8. PLC与HMI(触摸屏)间固定使用寄存器: (29)6.9. 触摸屏及后台操作定义(无专门要求) (31)7.触摸屏模拟量显示设定 (31)8.OMRON PLC通信协议 (33)8.1. PLC使用 (33)8.2. 对时使用 (34)8.3. 单元箱使用 (34)8.4. PLC通信协议接线图 (37)1.OMRON CJ1M系列PLC介绍当前水机自动化屏大多使用OMRON CJ1M系列PLC,这种PLC为模块式,而且没有底板。
威纶触摸屏作为从站利用Modbus与组态王通讯实例

威纶触摸屏通过Modbus与组态王通讯实例威纶触摸屏和组态王都是人机交互界面,都支持Modbus协议,可以进行通讯,这里将触摸屏作为从站,安装组态王的电脑作为主站。
一、触摸屏设置1.触摸屏系统参数设置,我们的目的是将OMRON PLC内的数据先传送到HMI上,再通过Modbus协议传到上位机上,这里就要添加两个设备,一个是PLC,一个是Modbus Server。
需要注意的就是其中PLC类型,接口类型,COM口的通讯参数设置,站号,这些要与上位机的参数设置相同才可以。
2.资料传输方式设置,在工具中有资料传输选项,点击新增,如下图,就可以将OMRON PLC里的位或字数据按照要求传送到HMI里的LW,LB内。
选择相应的地址类型,间隔,来源地址和目标地址即可。
如图我们已经设置好传送的目标,这里需要记录数据在HMI内的地址,参考下图地址对应表,将HMI内的数据按照地址对应到上位机里。
这样就完成触摸屏的设置。
二、组态王工程建立1.建立工程,打开组态王软件,在工程管理器内点击新建,按提示建立工程。
2.添加设备,在左侧目录树设备中任一COM口右侧新建处,双击新建设备,选择驱动——PLC——莫迪康——Modbus RTU COM,点击下一步,编辑设备名称,下一步,选择串口(选择串口时要注意查看我的电脑设备管理器连接通讯线的是哪一个端口,如果是COM3,这里相应的就要选COM3),下一步选站号,要与HMI 对应,其他默认即可。
此时左侧目录树就多出了COM3口,双击弹出参数设置窗口,按照HMI的参数进行设置。
这样就建好了设备。
3.定义变量,点击目录树左侧“数据词典”,在右边点击新建,想要从HMI上读多少数据就在这里建立多少变量,位变量就建立I/O离散,字变量就建立I/O实数,另外注意的就是连接的设备选择刚才建立的Modbus设备,寄存器地址特别注意要与HMI对应,参考上面地址图。
HMI中是LB0,在这里就是00001,HMI中是LW1,这里就是40002(或者是30002),以此类推。
基于MODBUS的EVIEW触摸屏与单片机系统的通讯实现方法

: 应用技术 2004年第3期广东自动化与信息工程 31基于MODBUS的EVIEW触摸屏与单片机系统的通讯实现方法 杨 圣 梁昔明(中南大学信息科学与工程学院)摘要:随着自动化领域对人机界面要求的提高,触摸屏在这领域得到越来越广泛的应用。
本文介绍了一种基于MODBUS 通讯协议的EVIEW 触摸屏与自主开发的单片机系统的通讯方法。
关键词:触摸屏;MODBUS ;单片机1引言 随着工业自动化的发展,基于PLC 、单片机和PC 机的自动化系统与自动化设备越来越普及,几乎遍布所有自动化领域,与之相应的人机交互系统也应运而生。
EVIEW 触摸屏是工业触摸屏领域的优秀代表,能够理想、生动地显示PLC 、单片机、PC 机上的数据信息。
本文介绍EVIEW 触摸屏和自主开发的单片机系统的通讯方法。
M ODBUS 协议是应用于电子控制器上的一种通用语言。
通过此协议,控制器相互之间可以通信。
它已经成为一通用工业标准。
有了它,不同厂商生产的控制设备可以连成工业网络,进行集中监控。
本系统使用MODBUS 的RTU 传输模式完成EVIEW 和单片机系统的通讯功能。
2 系统介绍 本系统由EVIEW 触摸屏和单片机控制系统组成。
单片机系统完成数据采集和基本数据处理及控制功能。
EVIEW 触摸屏完成数据显示和参数设定的功能,它还完成报警功能。
EVIEW 触摸屏支持RS232,RS485 两种通讯接口。
在工业控制领域,由于RS485具有可靠性高,传输距离远,且抗干扰能力强等优点,所以在本系统中采用RS485通讯口。
EVIEW 触摸屏的PC [RS-232] &PLC [RS-485] 通讯端口是连接PC 机的编程口和连接RS485/422外部设备的通讯口。
单片机系统采用CYGNAL 公司生产的C8051F005单片机,此单片机是完全集成的混合信号系统级芯片(SOC )。
其使用CIP-51核,CIP-51核采用流水线结构,机器周期由标准8051的12个系统时钟周期降为1个系统时钟周期,处理能力大大提高。
手把手教你学51单片机之十八RS485通信与Modbus协议(2021年整理)

(完整)手把手教你学51单片机之十八RS485通信与Modbus协议(word版可编辑修改)编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整)手把手教你学51单片机之十八RS485通信与Modbus协议(word版可编辑修改))的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整)手把手教你学51单片机之十八RS485通信与Modbus协议(word版可编辑修改)的全部内容。
在工业控制、电力通讯、智能仪表等领域,通常情况下是采用串口通信的方式进行数据交换。
最初采用的方式是RS232接口,由于工业现场比较复杂,各种电气设备会在环境中产生比较多的电磁干扰,会导致信号传输错误。
除此之外,RS232接口只能实现点对点通信,不具备联网功能,最大传输距离也只能达到几十米,不能满足远距离通信要求。
而RS485则解决了这些问题,数据信号采用差分传输方式,可以有效的解决共模干扰问题,最大距离可以到1200米,并且允许多个收发设备接到同一条总线上.随着工业应用通信越来越多,1979年施耐德电气制定了一个用于工业现场的总线协议Modbus协议,现在工业中使用RS485通信场合很多都采用Modbus 协议,本节课我们要讲解一下RS485通信和Modbus协议。
单单使用一块KST-51开发板是不能够进行RS485实验的,应很多同学的要求,把这节课作为扩展课程讲一下,如果要做本课相关实验,需要自行购买USB转485通信模块。
18。
1 RS485通信实际上在RS485之前RS232就已经诞生,但是RS232有几处不足的地方:1、接口的信号电平值较高,达到十几V,容易损坏接口电路的芯片,而且和TTL电平不兼容,因此和单片机电路接起来的话必须加转换电路。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Modbus协议下51系列单片机与eView触摸屏的通讯方法(组图)
Modbus协议由于其具有开放性、透明性、本钱低、易于开发等特点,已成为当
今产业领域通讯协议的首选。
本文介绍了一种基于Modbus通讯协议的eView触摸屏与常用的51单片机的通
讯方法。
该方法通过C51编程实现Modbus通讯,在51系列单片机上具有通用性,
有一定的鉴戒作用。
产业控制中经常需要观察系统的运行状态或者修改运行参数。
触摸屏能够直
观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运
行参数,人机交互性好。
单片机广泛应用于工控领域中,与触摸屏配合,可组成
良好的人机交互环境。
触摸屏与单片机通讯,需要根据触摸屏采用的通讯协议为单片机编写相应的通
讯程序。
Modbus协议是美国Modicon公司推出的,一种有效支持控制器之间以
及控制器经过网络(如以太网)与其他设备之间进行通讯的协议。
本文以STC89C51
单片机和人机电子有限公司的eView触摸屏为例,介绍其通讯程序的开发过程。
1 系统结构
实现触摸屏与单片机的通讯,主要是解决通讯协议的题目。
本文使用开放的Modbus通讯协议,以触摸屏作主站,单片机作从站。
eView触摸屏本身支持Modbus 通讯协议,假如单片机也支持Modbus协议,就可以进行通讯了。
eview触摸屏支持RS-232和RS-485两种通讯接口。
在产业控制领域,由于RS-485具有可靠性高、传输间隔远、抗干扰能力强等优点,所以在本系统中触摸屏与单片机通讯采用RS-485连接,传输速率设置为9600 kbps。
RS-485信号传输是一种半双工的传输方式,单片机通过一个RS-232/RS-485无源转换器把232信号转换成485信号,连接到eView触摸屏上。
图l为该系统的原理图。
单片机控制系统采用STC89C51系列单片机,其内部集成MAX810/STC810专用复位电路(原有外部复位可继续保存,与Intel 8051引脚兼容),具有抗干扰能力强、加密性强、高抗静电(ESD)、超低功耗等特点,而且价格低廉。
在本系统中,触摸屏是上位机,单片机是下位机。
2 Modbus协议
2.1 Modbus协议简介
Modbus协议是应用于电子控制器上的一种通用语言。
通过此协议,控制器相互之间、控制器经过网络(如以太网)与其他设备之间可以通讯。
它已经成为一种通用产业标准。
不同厂商生产的控制设备可以通过它连成产业网络,集中监控。
Modbus协议定义了一个控制器能熟悉使用的消息结构,而不管它们是经过何种网络进行通讯的。
它描述了一控制器请求访问其他设备的过程.如何回应来自其他设备的请求,以及怎样侦测错误并记录;制定了消息域格式和内容的公共格式。
当在某一Modbus网络上通讯时,此协议决定了每个控制器需要知道它们的设备地址,识别按地址发来的消息,以及决定要产生何种行动。
假如需要回应,则控制器将天生反馈信息并用Modbus协议发出。
在其他网络上,包含了M0dhus协
议的消息转换为在此网络上使用的帧或包结构。
2.2 Modbus RTU通讯数据传输模式
当控制器设备基于Modbus协议以RTU模式通讯时,消息中的每个字节包含2个4位的十六进制字符。
这种方式的主要优点是:在同样的波特率下,可比ASCII 方式传送更多的数据。
编码采用8位二进制,十六进制数0~9和A~F;消息中每个8位域都是由2个十六进制字符组成。
组织结构如下:
2.3 Modbus RTU消息帧结构
M odbus RTU消息帧结构如下:
(1)地址码
地址码为通讯传送的第一个字节。
这个宁节表明,由用户设定地址码的从机将接收由主机发送来的信息。
每个从机都有具有唯一的地址码,只有符合地址码的从机才能响应回送,且响应回送均以各自的地址码开始。
主机发送的地址码则表明将发送到的从机地址,而从机发送的地址码表明回送的从机地址。
地址0用作广播地址,以使所有的从设备都能熟悉。
(2)功能代码
功能代码为通讯传送的第二个字节。
Modbus通讯规约定义可能的代码范围是十进制的1~255。
当然,有些代码适用于所有控制器,有些仅适用于某种控制器,还有些保存以备后用。
主机发送请求,通过功能码告诉从机执行什么动作;从机响应请求,从机发送的功能码与从主机发送来的功能码一样,表明从机已响应主机进行操纵。
假如从机发送的功能码的最高位为1,则表明从机没有响应操纵或发送出错,主设备应用程序得到异议的回应后,典型的处理是重发消息。
表l列出了常用Modbus支持的部分功能码。
以读取线圈状态为例说明。
主站发送命令:[设备地址][命令号01][起始寄存器地址高8位][低8位][读取的寄存器数高8位][低8位][CRC校验的低8位][高8位]。
从站响应:[设备地址][命令号01][返回的字节个数][数据1][数据2]…[数据n][CRC校验的低8位][高8位]。
(3)数据区
数据区根据功能码的不同而不同。
数据区包含需要从机执行什么动作,或由从机采集的返送信息。
这些信息可以是实际数值、设置点、主机发送给从机或从机发送给主机的地址等。
例如,功能码告诉从机读取寄存器的值,则数据区必须包含要读取寄存器的起始地址及读取长度。
对于不同的从机,地址和数据信息都不相同。
(4)错误校验码
主机或从机可用校验码判别接收信息是否出错。
错误检测域包含一个16位的值(用2个8位的字符来实现)。
错误检测域的内容是通过对消息内容进行“循环冗余检测”得出的。
CRC域附加在消息的最后,添加时先是低字节然后是高字节,故CRC的高位字节是发送消息的最后一个宁节。
错误校验采用CRC-16校验方法。
3 软件编程
下面是采用C5l编写的软件,主要包括CRC校验和终端接收及波特率设置等。
由于篇幅有限,其他程序略。