2018-09-30 08:56:40 qq_33646304 阅读数 2338
  • 51单片机也能玩TFT彩屏-第2季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第3个课程,主要讲解TFT液晶显示器的原理和编程显示线条、文字、图片等。本课程的学习目标是对较复杂的TFTLCD的编程有所掌握,为以后更进一步学习显示打好更好基础。

    2690 人正在学习 去看看 朱有鹏
 使用MCGS在项目中已经有一年了,有些个人心得如下:
 1.MCGS的设备驱动是真的不好用,灵活性较差,当然这里针对MCGS与单片机通讯的时候,PLC设备还好。所以如果你想做MCGS与单片机通讯,最好采用他们提供的脚本驱动开发工具V2.0,这个在网上都能找到的,这里我就不给出链接了。这款软件使用的语言是类VB语言,不完全遵循VB语言的语法规则,所以你还是要看下他的语法手册,这个已经在软件中集成好了,不需要另找。总结下,使用这种方式基本可以实现项目的功能,但会有些许麻烦。如果你的时间够多,可以使用单片机方式开发人机界面,这样会使你的自由度很高。
 2.MCGS的以太网通讯暂不支持自主开发驱动,这点很局限
 希望各位能使用好MCGS,祝大家工作愉快!
2008-06-08 09:54:00 lyzhangxianglove 阅读数 1450
  • 51单片机也能玩TFT彩屏-第2季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第3个课程,主要讲解TFT液晶显示器的原理和编程显示线条、文字、图片等。本课程的学习目标是对较复杂的TFTLCD的编程有所掌握,为以后更进一步学习显示打好更好基础。

    2690 人正在学习 去看看 朱有鹏

PIC单片机与触摸屏串行通信MODBUS协议


    关键词:触摸屏 PIC单片机 Modbus协议 通信

工控中经常需要观察系统的运行状态或者修改运行参数。触摸屏能够直观、生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好。单片机广泛应用于工控领域中,与触摸屏配合,可组成良好的人机交互环境。触摸屏和单片机通信,需要根据触摸屏采用的通信协议为单片机编写相应的通信程序。Modbus协议是美国Modicon公司推出的一种有效支持控制器之间以及控制器经由网络(例如以太网)和其它设备之间进行通信的协议。本文以PIC16F877单片机和人机电子有限公司的eView MT510T型触摸屏为例,介绍其通信程序的开发过程。

1 系统结构

实现触摸屏与单片机的通讯,主要是解决通讯协议的问题。本文使用开放的Modbus通讯协议,以触摸屏作主站,单片机作从站。eView触摸屏本身支持Modbus通讯协议,如果单片机也支持Modbus协议,就可以进行通信了。触摸屏与单片机之间采用的RS-232C兼容接口直接连接,传输速率设置为9600kb/s。图1为该系统的电路图。

将PIC16F877单片机RC6、RC7口设置为异步串行通信模式,经过MAX232芯片将TTL电平转换为RS232电平,再与eView触摸屏PLC[RS-232]接口相连,即完成了硬件连接。eView触摸屏PLC[RS-232]接口的管脚2为TXD,管脚3为RXD。

2 Modbus通信协议介绍

Modbus通信协议是一种串行的主从通信协议,网络里仅有一台设置可作为主机(称Master),其它设备作为从机(称Slaver),主机不需编号,从机必须编号。协议定义了主机查询及从机应答的信息帧格式。通信时,主机首先向从机发出请求信息,符合相应地址码的从机接收通讯命令,并除去地址码,读取信息,如果没有出错,则执行相应的任务,然后把执行结果返给主机。若从机接收到的校验码与本机计算的不同,则说明数据在通信过程中出现错误,从机把这次请求视为无效,功能代码将被修改以用于指出回应消息是错误的,同时数据段包含了描述此错误信息的代码。当主机收到这一信息时,会重新发送请求信息。校验方式分为LCR(传送数据为ACSII时)校验或CRC(传送数据为二进制时)校验,这里采用CRC校验方式。
信息传输为异步方式,并以字节为单位。主从站之间通讯的字格式如表1所示。

表1 通讯的字格式

字格式(串行数据) 10位二进制
起始位 1位
数据位 8位
奇偶校验位 无
停止位 1位


Modbus协议可支持ASCII码或二进制格式的数据传输。ACSII码方式下每一个字节数据分两个字节传送,二进制方式下用一个字节传送,为了减少数据传输量,一般选二进制数据方式。各个区允许发送的字节均为16进制的0~9,A~F。二进制信息帧标准结构为:

初始结构 ≥4字节的时间

地址码 1字节

功能码 1字节

数据区 N字节

错误校验 16位CRC码

结束结构 ≥4字节的时间

二进制模式中,信息开始至少需要3.5个字符的静止时间,依据使用的波特率,很容易计算这个静止时间。发送完最后一个字符后,也有一个至少3.5个字符的静止时间,然后才能发送一个新的信息。网络上的设备连续监测网络上的信息,包括静止时间。

 


 

3 单片机与触摸屏地址的对应关系

eView触摸屏只支持Bit和Word地址类型,而实际的单片机或其它控制器还有Byte、Double Word等表示方法,因此在进行通信时,需要把单片机和触摸屏的数据进行变换。触摸屏画面元件读取地址的设备类型有LW、0x、1x、3x、4x、RWI、RW等选项。其中,LW表示该元件读取的是触摸屏内部的地址,如其它元件的地址;0x表示读取的是控制器的输出信号;1x表示读取的控制器的输入信号;3x和4x指控制器的寄存器地址类型,其中4x是可读可写的,3x是只读的;RWI、RW都是触摸屏的内部地址,起辅助作用。使用这些读取地址的设备类型,触摸屏即可显示或设定控制器寄存器或I/O口的数值。以“数值输入”元件为例,通过“小键盘”输入数据即可设置单片机寄存器或I/O口的数值。如果启动了“触发地址”,那么当被触控时,输入的数据就被存放到了指定的单片机地址中。

4 通信程序的开发

触摸屏与单片机的通信程序采用PIC单片机C语言编写。编译工具选择Hitech公司的PICC编译器。程序共分三大模块,即初始化模块、数据接收模块以及数据处理及发送模块。主程序流程图如图2所示。


PIC16F877单片机USART功能模块带有一个八位的波特率发生器BRG,BRG支持USART的同步和异步工作方式。用SPBRG寄存器控制一个独立的八位定时器的周期。在异步方式下,发送状态/控制寄存器TXSTA的BRGH位(即D2)被用来控制波特率。对串行口进行的初始化如下:

GIE=1; %全局中断允许;

SPBRG=25; %设置波特率为9600;

TXSTA=0x04; %选择异步高速方式;

RCSTA=0x80; %允许同步串行口工作;

RTISC6=1;

TRISC7=1; %将C口的RC6和RC7设置为异步串行通信模式;

PFIE=1; %外围接口中断允许;

RCIE=1; %USART接收中断允许;

TXIE=1; %USART发送中断允许;

数据接收模块由一个中断函数组成。该中断函数将触摸屏发来的Modbus数据帧存储在一个自定义的数组中,当一帧数据接收完时,置接收结束标志位为1,转入数据处理及发送模块。串行通信接收器的核心是接收移位寄存器RSR,当接收到停止时,如果RCREG缓冲器为空,RSR就把接收到的数据送入RCREG。传送完成后,接收中断标志位RCIF被置1。实际的中断是否被CPU响应,可以通过设置外围接口中断允许寄存器PIE1的中断允许位RCIE来控制。

 


 

数据处理及发送模块执行Modbus协议功能码对应的运用。eView触摸屏与单片机以Modbus协议通信,用到的Modbus功能码如表2所示。

表2 通信程序用到的功能码

功能码 eView地址名称 含  义 作  用 
1 0x 读开关量输出 读取一路或多路开关量输出状态
3 4x 读保持寄存器 读取一个或多个保持寄存器的数据
5 0x 写开关量输出 强置一路继电器的“分/合”输出
1x


以Modbus功能码03为例来说明触摸屏及单片机的实际通信数据格式。如单片机地址编号为01H,触摸屏需要查看单片机中地址为0031H的寄存器的值,发送命令格式如表3所示。
表3 触摸屏发送数据结构

数据段名称 数据值
地址 1
功能码 3
读取地址高位 0
读取地址低位 31
读取数据个数高位 0
读取数据个数低位 1
CRC校验码高位 D5
CRC校验码低位 C5


假设单片机中地址为0031H的寄存器中断为05H,则单片机的回复命令如表4所示。

表4 单片机应答数据结构

数据段名称 数据值
地址 1
功能码 3
读取字节数 2
寄存器数据高位 0
寄存器数据低位 5
CRC校验码高位 78
CRC校验码低位 47


当波特率达到38400kb/s时,通信仍然稳定可靠。本系统具有连接电路简单、组态灵活、通信可靠性高等特点,并已成功应用于物料筛选控制系统项目中。由于Modbus通信协议的开放性的特点,国外进口控制器串行通信大者支持该协议,因此本文所实现的采用Modbus协议的串行通信具有广泛的应用价值。

 

 

2013-07-27 15:55:23 sqcg999 阅读数 7249
  • 51单片机也能玩TFT彩屏-第2季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第3个课程,主要讲解TFT液晶显示器的原理和编程显示线条、文字、图片等。本课程的学习目标是对较复杂的TFTLCD的编程有所掌握,为以后更进一步学习显示打好更好基础。

    2690 人正在学习 去看看 朱有鹏

很多时候,工业控制或者产品设计方面受到PLC这种功能确定,扩展麻烦,成本昂贵等方面的制约因素,需要独立开发一种特殊功能,但是又需要连接触摸屏通讯,工程师在这个方面往往需要花费很大功夫,现在我要帮大家解决的问题就是 单片机与人机界面触摸屏通讯的最简单,最有效的 2种方法,其实就是分为2种通讯协议,即工业标准的 Modbus RTU协议和工程师自己定义的 自由协议。

本实例采用其中一款人机界面作为参考,提供一系列的技术支持和公布单片机源代码,加上公司的人机界面支持自由协议等等先天优势,开发工程方便快捷有效。

方案比较:

方案一  modbusrtu协议:

     优点:工业标准通讯协议,具有通用性,,传输数据量大

     缺点:需要时间去了解协议的格式和以及按照规定编写通讯程序(我们提供MODBUS-RTU源代码,客户直接移植就可以,不必费心)

方案二   自由协议:

     优点:数据格式客户自己定义,灵活多变,定制性强,可以模拟任何已知报文的通讯协议,单片机工程师比较容易接受,容易上手

     缺点:传输数据量不大,通用性不强,移植不方便

  工程师可以根据以上两种通讯协议的优缺点来选择理想的方案;

单片机工程师可以索取单片机自由协议或者Modbus RTU协议  QQ:1962162065

现在我们重点介绍工业触摸屏人机界面的自由通讯协议。

首先下载工业触摸屏人机界面的组态软件,下载安装好软件之后,新建一个工程文件,

设备对应的是公司出产产品型号,通道是指设备代号,0是代表触摸屏本身,点击新增,出现如下设置:

 

接口选择可以为串口,CAN Bus和内部(共享内存)三种,这边我们选择串口,因为人机界面有1-2个串口,这些串口既可以做RS232,又可以做RS485,根据客户工程需求接线,通讯协议对应的就是单片机工程师需要用的协议,其中有Modbus rtu协议,自由协议Free Protocol,当然还包括西门子200,台达PLC,欧姆龙,三菱等协议,这里我们选择COM1自由协议Free Protocol,通讯速率57600,数据位8,1位停止位,偶校验,如下:

点击确定进入用户工程师的信息填写栏:

也可以直接点击完成进入画面编辑窗口:

到这里,我们就可以像拼图游戏一样拼自己喜欢的界面了,这边,我做一个最简单的工程如下用位按钮开关控制单片机的LED灯,采集单片机的数据(AD采集)显示在组态软件的数码管(可以电脑串口连接单片机在线模拟,方便开发工程)

然后我们要把位按钮的属性绑定到人机界面的系统寄存器,然后再用人机界面内置的宏指令通讯函数output函数把寄存器数据传输给单片机,让单片机接收这个指令之后进行动作控制,方法实现如下:

我们把位按钮1绑定到人机界面系统寄存器LB的第0个里面,再用一个LED指示灯观察按钮的状态(绑定系统寄存器LB0

对于数码管显示,属性设置原来差不多,但是需要用input函数将从单片机采集的数据存储到人机界面系统寄存器,再通过宏指令函数映射显示出来,方法如下:

我们将通道一绑定到系统寄存器LD的第1个寄存器,LD是数据寄存器,LB是布尔量的位寄存器,注意两种寄存器的区别。

接下来我们要用到人机界面的组态软件内置的通讯函数,数学运算函数和其他函数了。由“设置”菜单那里进入到宏指令编辑器进入宏指令编辑:

 

 

点击新增,我们写一个宏指令通讯函数,向单片机发送控制指令和接受数据:

具体编程如下:

宏指令macro_1:

void Macro_main( )

{

unsigned char dat[4];

unsigned short dat1[4];

int re_dat;

Input( 1, dat, 4, re_dat);

/*如果不明白函数使用,可以点击函数向导按钮查找函数使用说明

 

【描述】

第一个参数channel表示通道,如果通道为com1,则channel=1;如果通道为com2,则channel=2,数据类型为int

第二个参数pString表示写入通道的字符串的地址,数据类型为unsigned char *

第三个参数count表示字符串中的字符个数,数据类型为int

第四个参数result表示Output函数运行后返回的结果,如果result大于0,则表示读写有效,数据类型为int

注意:此函数只能用在freeprotocol(自由协议通道)中。

【用法】

Input(channel,pString,count,result);

【举例】

char srt[9];

int result;

Input(1,str[0],9,result);

*/

        dat1[0]=dat[0];

dat1[1]=dat[1];

dat1[2]=dat[2];

dat1[3]=dat[3];

SetWordData(0,1,1,16, dat1[0]);

SetWordData(0,1,2,16, dat1[1]);

SetWordData(0,1,3,16, dat1[2]);

SetWordData(0,1,4,16, dat1[3]);

}

 

macro_2:用于发送指令到单片机进行控制,主要用到output函数

static unsigned char key[3];

void Macro_main( )

{

bool key_data[16];

int re_dat;

GetByteData(0, 1,0, 9, 0,key_data);

     key[0] = key_data[7]<<7 |  key_data[6]<<6 |  key_data[5]<<5 |  key_data[4]<<4 |  key_data[3]<<3 |  key_data[2]<<2 |  key_data[1]<<1 | key_data[0];

     //key[1]=key_data[15]<<7 |  key_data[14]<<6 |  key_data[13]<<5 |  key_data[12]<<4 |  key_data[11]<<3 |  key_data[10]<<2 |  key_data[9]<<1 | key_data[8];

      key[1]=key_data[8];

Output( 1, key, 2, re_dat);

      

}

对应单片机下位机的编程,作为单片机开发者应该都知道如何编程了.

 

2019-10-11 09:44:33 weixin_43819606 阅读数 41
  • 51单片机也能玩TFT彩屏-第2季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第3个课程,主要讲解TFT液晶显示器的原理和编程显示线条、文字、图片等。本课程的学习目标是对较复杂的TFTLCD的编程有所掌握,为以后更进一步学习显示打好更好基础。

    2690 人正在学习 去看看 朱有鹏

移植modbus协议

单片机 触摸屏通道
usSCoilBuf[0] 8 7 6 5 4 3 2 1
usSCoilBuf[1] 16 15 14 13 12 11 10 9
usSCoilBuf[2] 24 23 22 21 20 19 18 17
usSCoilBuf[3] 32 31 30 29 28 27 26 25
usSCoilBuf[4] 40 39 38 37 36 35 34 33
usSCoilBuf[5] 48 47 46 45 44 43 42 41
usSCoilBuf[6] 56 55 54 52 52 51 50 49
usSCoilBuf[7] 64 63 62 61 60 59 58 57
usSCoilBuf[8] 72 71 70 69 68 67 66 65
usSCoilBuf[9] 80 79 78 77 76 75 74 73
2018-08-23 16:21:51 tm19891001 阅读数 1250
  • 51单片机也能玩TFT彩屏-第2季第3部分

    本课程是《朱有鹏老师单片机完全学习系列课程》第2季第3个课程,主要讲解TFT液晶显示器的原理和编程显示线条、文字、图片等。本课程的学习目标是对较复杂的TFTLCD的编程有所掌握,为以后更进一步学习显示打好更好基础。

    2690 人正在学习 去看看 朱有鹏

闲来无事,做个记录,触摸屏使用迪文DGUS-T5D2 10.1寸触摸屏,单片机STM32F013系列,欧姆龙CP1E-N40PLC,之所以通过单片机转发是因为迪文触摸屏价格的巨大优势,核算单片机成本后,10.1寸触摸屏价格不超过400元,其次就是迪文触摸屏质量还算可以,进入正题。

1.迪文触摸屏配置:

        1)串口配置:迪文触摸屏T5触摸屏串口配置在文件T5UID2.CFG文件,具体配置参看迪文手册:"T5UID2应用指南.PDF",我配置的串口参数:115200,8,1,N;

        2)  界面配置:根据使用的触摸屏分辨率,做一张相应分辨率的图片,做好按键,数据显示框,再做一张键盘页面,通过迪文软件转换成迪文屏幕可以使用的图片将两张图片加载到软件;

      注:T5屏的0x1000以上变量地址用户使用,这里需要注意。

                 (1)配置按键:在图片的按键部分放置一个“按键返回”控件,配置:按键地址0x1000,键值0,勾选“数据自动上传”;

                          键盘按键配置:在图片的按键部分放置多个“基础触控”控件,根据提示设定键值:0-9,退格,确认,取消等键值,设定好后放在对应位置;

                 (2)显示框配置:在图片显示框部分放置一个“数据变量显示”控件,变量地址0x1100;

                (3)输入框配置:这个需要做好键盘;在图片显示框部分放置一个“变量数据录入”控件,变量地址0x2100,勾选“数据自动上传”,键盘设置,选择做好的键盘,设置好对应的显示位置坐标(这里是控制用户输入的数据显示在屏幕那个位置)。

    至此,触摸屏配置完成;

2.STM32F103VCT6

配置:

     1)硬件:迪文T5触摸屏使用无壳体屏串口输出电平为TTL电平,由于传输距离有5米左右(单片机还有其他用途,距离较远),所以触摸屏端使用232芯片转换为232电平.

                 屏端:24V输入使用LM7805输出5V给屏和MAX232供电,屏幕供电的24地很干净,所以不做隔离;

                单片机和屏端:同样24V输入使用LM7805输出5V再通过LM1117-3.3输出3.3给STM32F103VCT6和SP3232EEN供电,单片机端232转换芯片使用兼容3.3V的SP3232EEN;

                 CP1E端:使用RS232或者RS485选件板;

                单片机对CP1E端:使用MAX3485或者SP3232EEN连接转口,芯片选择兼容3.3V;

   至此,硬件配置完成;

    2)软件:

                  1)PCL-CP1E:使用hostlink mode-c协议,为接收到命令后主动响应,所以PLC端不需要编程;

                  2)STM32软件使用“STM32CubeMX”配置,生成KEIL MDK5工程,很简单,网上有很多教程,需要使用什么功能可以去查;

3.通讯协议:

        1)STM32F103VCT6与T5屏按键的实现:

              按键下发给单片机的数据格式:  5A  A5  06 83 10 00 01 00 00

                      5A A5:帧头,可以在T5UID2.CFG文件修改;

                            06:该字节后接收的数据长度;

                            83:迪文指令;

                       10 00:变量地址;

                            01:数据长度,单位“字”;

                       00 00:数据,这里是前面按键控件键值设定多少,接收就是多少;

          然后根据接收的键值不同来控制PLC-CP1E的开关量,在这里我接收到上个按键之后,是控制PLC的H1.00的打开和关闭,

下面阐述开关PLC的H1.00;

         因为H区的写入是按字写入的,所以在写H1.00之前,需要保持H1.01--H1.15的状态不变,我们先读取H1整个字节的状态,然后对第0位取反后在写入PLC的H1寄存器,hostlink mode-c协议为ASCII码:   

          读H区的指令格式如下:@00RH+0001+0001+FCS校验(两字节)+*+结束码,对应单片机程序如下:

            usart2_txBuf[0]  = 0X40;//@  0X40
            usart2_txBuf[1]  = 0X30;//0  0X00
            usart2_txBuf[2]  = 0X30;//0     0X00
            usart2_txBuf[3]  = 0X52;//R     0X52
            usart2_txBuf[4]  = 0X48;//H     0X48
        
            usart2_txBuf[5]=(uint8_t)((start_addr>>12)&0x000f);
            usart2_txBuf[5]=HEX2ASCII(usart2_txBuf[5]);        
            usart2_txBuf[6]=(uint8_t)((start_addr>>8)&0x000f);
            usart2_txBuf[6]=HEX2ASCII(usart2_txBuf[6]);            
            usart2_txBuf[7]=(uint8_t)((start_addr>>4)&0x000f);
            usart2_txBuf[7]=HEX2ASCII(usart2_txBuf[7]);    
            usart2_txBuf[8]=(uint8_t)(start_addr&0x000f);
            usart2_txBuf[8]=HEX2ASCII(usart2_txBuf[8]);//4字节地址
            
            usart2_txBuf[9]=(uint8_t)((len>>12)&0x000f);
            usart2_txBuf[9]=HEX2ASCII(usart2_txBuf[9]);        
            usart2_txBuf[10]=(uint8_t)((len>>8)&0x000f);
            usart2_txBuf[10]=HEX2ASCII(usart2_txBuf[10]);            
            usart2_txBuf[11]=(uint8_t)((len>>4)&0x000f);
            usart2_txBuf[11]=HEX2ASCII(usart2_txBuf[11]);    
            usart2_txBuf[12]=(uint8_t)(len&0x000f);
            usart2_txBuf[12]=HEX2ASCII(usart2_txBuf[12]);//读取长度
            
            XORCheck(usart2_txBuf, 13);
            usart2_txBuf[13]=((FCS_CHECK>>4)&0x0f);
            usart2_txBuf[13]=HEX2ASCII(usart2_txBuf[13]);    
            usart2_txBuf[14]=(FCS_CHECK&0x0f);
            usart2_txBuf[14]=HEX2ASCII(usart2_txBuf[14]);//校验
            FCS_CHECK=0;
            
            usart2_txBuf[15]=0X2A;// "*"   0X2A
            usart2_txBuf[16]=0X0D;//   结束码

   单片机等待PLC返回数据后,返回数据为ASIIC码形式,处理数据后并对H1的第0位取反,在将对应数据写到PLC的H1寄存器;           写H区指令如下:@00WH+0001(写入的开始地址)+0001(写入数据)+FCS校验+*+结束码,对应单片机程序如下:

    usart2_txBuf[0]  = 0X40;//@   0X40
    usart2_txBuf[1]  = 0X30;//0   0X00
    usart2_txBuf[2]  = 0X30;//0     0X00
    usart2_txBuf[3]  = 0X57;//W     0X57
    usart2_txBuf[4]  = 0X48;//H     0X48
    
    usart2_txBuf[5]=(uint8_t)((start_addr>>12)&0x000f);
    usart2_txBuf[5]=HEX2ASCII(usart2_txBuf[5]);        
    usart2_txBuf[6]=(uint8_t)((start_addr>>8)&0x000f);
    usart2_txBuf[6]=HEX2ASCII(usart2_txBuf[6]);            
    usart2_txBuf[7]=(uint8_t)((start_addr>>4)&0x000f);
    usart2_txBuf[7]=HEX2ASCII(usart2_txBuf[7]);    
    usart2_txBuf[8]=(uint8_t)(start_addr&0x000f);
    usart2_txBuf[8]=HEX2ASCII(usart2_txBuf[8]);
    for(i=0;i<len;i++)
    {
        usart2_txBuf[i*4+9]=(uint8_t)(((*(cio_data+i))>>12)&0x000f);
        usart2_txBuf[i*4+9]=HEX2ASCII(usart2_txBuf[i*4+9]);
        
        usart2_txBuf[i*4+10]=(uint8_t)(((*(cio_data+i))>>8)&0x000f);
        usart2_txBuf[i*4+10]=HEX2ASCII(usart2_txBuf[i*4+10]);
        
        usart2_txBuf[i*4+11]=(uint8_t)(((*(cio_data+i))>>4)&0x000f);
        usart2_txBuf[i*4+11]=HEX2ASCII(usart2_txBuf[i*4+11]);
        
        usart2_txBuf[i*4+12]=(uint8_t)((*(cio_data+i))&0x000f);
        usart2_txBuf[i*4+12]=HEX2ASCII(usart2_txBuf[i*4+12]);
    }
    XORCheck(usart2_txBuf, 13);
    usart2_txBuf[len*4+9]=((FCS_CHECK>>4)&0x0f);
    usart2_txBuf[len*4+9]=HEX2ASCII(usart2_txBuf[len*4+9]);    
    usart2_txBuf[len*4+10]=(FCS_CHECK&0x0f);
    usart2_txBuf[len*4+10]=HEX2ASCII(usart2_txBuf[len*4+10]);
    FCS_CHECK=0;
            
    usart2_txBuf[len*4+11]=0X2A;// "*"   0X2A
    usart2_txBuf[len*4+12]=0X0D;//结束码

cio_data为定义的数组,里面存放需要写入的数据值,H1的第零位取反后放入这里,len位写入寄存器的长度;这里我们只写入H1,所以len=1;

至此,更改H1.00结束;

同理根,据上述操作使用WD和RD命令可以读取和写入PLC的D区;

       2)写入T5屏,使T5屏显示读取的PLC数据:

            使用WD命令读取PLC的数据后,将plc的数据处理,然后发送给触摸屏,发送触摸屏程序如下:

            com_buf[0] = 0x5a;
            com_buf[1] = 0xa5;
            com_buf[2] = 0x05;
            com_buf[3] = 0x82;


            com_buf[4] = 0x11;//写入触摸屏的地址
            com_buf[5] = 0x00;

      
           com_buf[6] = 0x00;

           com_buf[7] = 0x05;  写入的数据5

            HAL_UART_Transmit(&huart1,com_buf,8,20);//STM32F103发送函数;

触摸屏供电和RS232<-->TTL硬件电路如下图:

实物图,由于没有正好大小的电容,电感,所以看上去有点歪:

 

      

没有更多推荐了,返回首页