Suzhou JiaHai Electronic Hitech co.,Ltd |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
苏州嘉海电子科技有限公司是一家以单片机开发,工业自动化工程设计、系统集成以及中、低压电器成套为主要经营范围的科技型企业。 公司专门从事于单片机开发、工业自动化项目集成的高新技术型企业。主要产品是基于单片机程序实现的自动化控制器,科技含量高、应用范围广泛、应用领域涉及各行各业的过程控制,电子、机械、交通、化工、机电、家电、通讯、安保等诸多行业。公司致力于企业的品牌建设,为用户提供先进、可靠、实用的自动化产品及系统解决方案,帮助用户选用他们生产需要、能带来价值的产品和系统。公司成立以来,在港机、建材、电力、冶金、石化、轻工、制药、环保以及汽车车轮、机床等行业取得了很好的业绩。供货渠道通畅,工程技术先进以及众多行业的实际工作经验,是我们向用户提供一流产品及服务的可靠保证。 单片机开发是本公司的主导产品,我们对本公司属下的所有产品系列具有完全自主知识产权。振冲数据监控记录仪,是一个技术含量较高、集计算机软硬件为一体的产品,运用在上海洋山深水港的地基加固工程中,有一定的影响力,并获二十一届上海市优秀发明一等奖。恒温数据控制系统及记录软件,在中国航天科技研究院五院510研究所的国家重点实验室使用,可靠性很高。 近年来,公司还在国内众多的发电厂、钢铁厂展开过许多工程项目,由此汇集了国内外一流的品牌产品,DCS、PLC、UPS、变频器、软启动器、阀门、电机、电力配电、低压电器、电线电缆、网络通讯等系统集成案例。使公司的业务能力有了大幅提高。 苏州嘉海电子科技有限公司的全体员工,真诚与各界朋友合作,与您共创美好的未来! 相关专业文集,网站建设中,敬请关注…… |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
S7-200 smart PLC自由通讯口在液压测试系统中的应用 本文介绍S7-200 smart PLC自由通讯口和Visual Basic 6.0的软件开发在自动控制工程上的技术应用。对PLC而言常规的数字量输入、输出和模拟量输入等在这里只是个标配。案例工程是液压系统车辆底盘测试系统,用PLC的自由通讯口协议和VB6.0做上位机监控软件,绘制在测试过程的液压压力、温度和其他工艺数据等实时曲线、历史数据记录、数据报表,工程意义在于对产品质量分析和后续产口加工技术跟踪。 本文的包含三部分, 测试系统的工艺介绍、SIEMENS-S72--PLC程序、Visual Basic 6.0程序代码。 关键词:S7-200 smart PLC RS485自由通讯协议,VB6.0软件开发和COMMUNICATION控件;
车辆底盘液压系统的主要部件有液压阀、液压电机、角度编码器、位移传感器和阻力阀等,测试系统通过采样液压伺服油缸在不同位置的液压压力数据,相关测试的关键部件的技术参数如下: 1. 油泵流量:47.5L/MIN; 2. 工作压力:MAX 22MPa; 3. 液压油缸:最大行程800mm,φ80缸径; 4. 伺服油缸:带18T负载传感器的,D634 R24KOM1NSS2带放大器; 5. 主要仪表: 1) 角度传感器:绝对旋转编码器,用于油缸行程的测量,控制和测量精度5%,频率1Hz。在任意油缸行程位置设置为相对原位,作为测试工艺的原点位; 2) 压力变送器:摆缸左压力PA、摆缸右压力PB和连接在泄压阀上的负载压力,用于采样和存储压力数据,后于低压报警,以保证测试条件和相关记录数据的准确性; 3) 温度传感器:测量液压缸内油温,并储存测量的数据; 按拟定的测试工艺路谱发送的位移-时间曲线信号,调节控制伺服阀、液压油缸,按位移-时间曲线运行,并实时设置液压油缸的运行压力。监制软件即根据运行图谱和采样到的压力及位置(摆缸的角度)数据绘制和保存位移-时间,位移-压力,位移-温度,位移-负载曲线和数据表格,数据曲线及表格。图1和图2,上位机记录软件的趋势图、数据表格示样,供参考。
图1、车辆底盘测试监控系统数据曲线示样
图2、车辆底盘测试监控系统数据记录表格示样
S7-200 smart PLC,是一种小型、高性价比的可编程控制器,在一些比较小的工业自动化项目常用,有多款一体型CPU供工程应用配置。单一CPU本体自带PROFINET接口RS485通讯接口,也可以用扩展模块和信号扩展卡增加最多是4个通讯接口,S7-200 smart PLC自带MPI协议,也可通过指令库加载Modbus-RTU协议、USS协议。本工程案例选用S7-200 smart PLC SR40为主模块,以下叙述自由通讯口的PLC程序编写。 所谓自由口协议,就是没有标准的通讯协议。 PLC的自由协议是以RS-485为物理接口,是呼叫应答方式交换数据。从工程技术开发层面上看,相比MPI协议、Modbus-RTU协议、USS协议而言,自由通讯口协议在PLC程序编写上更繁杂,但优势是自由编写,灵活应用。 自由通讯口的程序包括:通讯接口初始化、接收中断、数据校验处理、发送中断等,以下分别给PLC指令表语言代码清单,供参考。 自由通讯口初始化编写程序,在写程序之前,先列出与通讯口相关特殊寄存器功能意义,见下表1:
表1: S7-200 smart PLC自由通讯串口初始化的特殊寄存器
初始化程序,只是在PLC上电时执行第一个指令执行周期,初始程序定义了串口号、功能及通讯参数,更有用于发送和接收的中断程序入口。并对特殊寄存器赋初值。启动中断程序机制。实际工程应用中的PLC程序用梯形图写出来的,为了文本整洁和减少幅面,本文以指令表语言作程序清单。 // SUBROUTINE COMMENTS Press F1 for help and example program Network 1 --// 原始数据初始化 LD SM0.1 FILL +0, VW0, 100 AENO FILL +0, VW100, 100 Network 2 --// 串口初始化9600,N,1,1 //SMB87 允许接收,用中断开始接收数据 中断8 SMB94 设置为最大缓冲区-- 初始化设置 // SMB30: 通讯端口0, 00 0 010 00 09H 自由通讯模式,9600 不校验,8位; // SMB87: 通讯端口0, 1011 0000 B0H 接收信息状态字; // SMB90: 通讯端口0, 空闲时间按线设置; // SMB94: 通讯端口0, 要接收的最大字符数; LD SM0.1 MOVB 16#09, SMB30 MOVB 16#B0, SMB87 MOVB 16#AA, SMB88 MOVW 0, SMW90 MOVB 8, SMB94 ATCH INT1, 9 ATCH INT2, 23 ENI Network 3 --// 转中断定时中断程序--发送程序 LD SM0.1 MOVB 50, SMB34 ATCH INT0, 10 Network 4 --// 通讯数据复位---共四个通讯终端 LD SM0.0 AB>= VB120, 100 ANDB 16#0, VB120
Network 5 --// 通讯发送数据个数 // 自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 // 上位机发送:AAH D1 D2 D3 D4 D5 D6 COMID 其中:COMID= D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; // 下位机应答:AAH B1 B1 B3 B4 B5 B6 COMID 其中:COMID= B1 XOR B2 XOR B3 XOR B4 XOR B5 XOR B6; LD SM0.0 MOVB 8, VB300 Network 6 --// 通讯终端--发送8位数据 LD SM0.0 LPS MOVB 16#AA, VB301 A M12.0 MOVB 88, VB307 LPP AN M12.0 MOVB 0, VB307
Network 7 --// 通讯超时 LD SM0.1 MOVB SMB86, AC0 AENO ANDB 16#07, AC0 AENO AB<> AC0, 0 MOVB 20, SMB34 ATCH INT0, 10 AENO ANDB 16#F8, SMB86 AB<> AC0, 0 MOVB 20, SMB34 ATCH INT0, 10 AENO ANDB 16#F8, SMB86 //***************************************************************************************************************
主程序循环,调用多个功能子程序,包括通讯协议里的数据校验处理等,相关自由通讯协议的定义,在接下来的内容详细介绍,文本中打“//”后面的文字是做程序注解,以方便对程序的理解。
TITLE= S7-200--PLC自由通讯程序,PLC发送 下位机是单片机控制 // 十六进制数据格式 AA、D1、D2、D3、D4、D5、D6、ID 其中 ID = D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; Network 1 --// 系统初始化部分 // 自由通讯协议,通讯参数:9600,8,N,1,共四个站点,AAH、BBH、CCH、DDH,S7-200PLC为应答方式; LD SM0.0 CALL SBR0
Network 2 --// 通讯数据处理--发送数据 // 通讯发送,十六进制数据格式 AA、D1、D2、D3、D4、D5、D6、ID 其中 ID = D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6 LD SM0.0 CALL SBR1
Network 3 --// 发送数据--通讯识别号 COMID // 自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 LD SM0.0 LPS MOVB VB302, VB310 AENO XORB VB303, VB310 AENO MOVB VB304, VB311 AENO XORB VB305, VB311 AENO MOVB VB306, VB312 XORB VB307, VB312 LPP MOVB VB310, VB313 AENO XORB VB311, VB313 AENO MOVB VB312, VB308 XORB VB313, VB308
Network 4 --// 数据接收处理 LD SM0.0 LPS MOVB VB80, VB180 AENO MOVB VB81, VB181 LRD MOVB VB82, VB182 AENO MOVB VB83, VB183 LPP MOVB VB84, VB184 AENO MOVB VB85, VB185 // 主程序返回,循环 //***************************************************************************************************************
模拟量处理子程序是液压测试系统中很重要的部分,工程意义就是要读取实际运行数据和对数据的记录处理。模拟量通常也叫A/D量,本工程中的A/D量包括液压压力、温度及角度数据采样。模拟量数据是经EM AEO8护展单元读取,在本案例中做了程序功能块,也可以是一个自定义的函数功能块,定义了A/D量数据上、下量程等中间量,经A/D量的换算处理后的数据列出实数类型和整数类型二种格式,供上位机读取和不同运算功能调用。图3,STEP 7 MICRO/WIN SMART软件的界面,PLC项目列表包括:PLC硬件配置、程序块等。图中主要A/D功能的编写示例。
图3:模拟量处理功能块
图3中,程序块SBR2就是定义的功能函数,主程序或子程序有多次调用指令:CALL SBR2,代入A/D量的上量程和下量程,即可换算相关模拟量数据。这也是结构化编程,模块运用。
Network 1 --// 模拟量处理--摆缸左压力、摆缸右压力 LD SM0.0 CALL SBR2, AIW32, 0.0, 1000.0, VD340, VB305 CALL SBR2, AIW34, 0.0, 1000.0, VD350, VB306 Network 2 --// 模拟量处理--PA压力、PB压力 LD SM0.0 CALL SBR2, AIW36, 0.0, 1000.0, VD360, VB303 CALL SBR2, AIW38, 0.0, 1000.0, VD370, VB304 Network 3 --// 模拟量处理--温度、角度控制 LD SM0.0 CALL SBR2, AIW40, 0.0, 1000.0, VD380, VB307 CALL SBR2, AIW42, 0.0, 1000.0, VD390, VB302
// 调用A/D子程序返回,循环 //***************************************************************************************************************
中断程序0:是在初始化程序里开通的子程序,中断程序0是独立于主循环程序,分时运行,本案例工程中的中断程序0是执行XMT指令,作数据发送,同时给接收计数区清零。
Network 1 --// 定时发送数据 // 自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 LD SM0.0 XMT VB300, 0 AENO ANDB 16#0, VB120 // 中断程序0子程序结束,返回主程序 //***************************************************************************************************************
中断程序1:同中断程序0相似,是在初始化程序里开通的子程序,中断程序1同样独立于主循环程序,分时运行,本案例工程中的中断程序1是执行RCV指令,作数据接收。
Network 1 --// 接收子程序 // 自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 // 上位机发送:AAH D1 D2 D3 D4 D5 D6 COMID 其中:COMID= D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; LD SM0.0 RCV VB200, 0 AENO INCB VB120 // 中断程序1子程序结束,返回主程序 //***************************************************************************************************************
中断程序2:同中断程序0、1相似,是在初始化程序里开通的子程序,中断程序2同样独立于主循环程序,分时运行,本案例工程中的中断程序2是执行RCV指令完成后,作接收数据的有奇偶校验、纠错处理,并将接收到的有效数据存放指定的存储空间,作运行参数使用。
TITLE=中断程序注释 Network 1 --// 发送数据--通讯识别号 COMID 通讯成功后,发送下一个,共八个数据 // 自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 // 上位机发送:AAH D1 D2 D3 D4 D5 D6 COMID 其中:COMID= D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; LD SM0.0 MOVB VB202, VB210 AENO XORB VB203, VB210 AENO MOVB VB204, VB220 AENO XORB VB205, VB220 AENO MOVB VB206, VB230 AENO XORB VB207, VB230 AENO MOVB VB210, VB240 AENO XORB VB220, VB240 AENO MOVB VB230, VB250 XORB VB240, VB250 Network 2 --// 接收数据成功--16HAA // 接收数据成功--16HAA 通讯识别号相等后,通讯成功接数据 // 自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 LDB= VB201, 16#AA AB= VB250, VB208 LPS MOVB VB202, VB80 AENO MOVB VB203, VB81 AENO MOVB VB204, VB82 AENO MOVB VB205, VB83 AENO MOVB VB206, VB84 AENO MOVB VB207, VB85 LPP FILL +0, VW200, 50 // 中断程序2子程序结束,返回主程序 //***************************************************************************************************************
自由通讯协议,即是自定义的非标协议,本案例工程是上位机作主发数据,PLC接收正确数据后回复上位机制应答数据,是主叫应答方式。结合上述的PLC源程序,综合起来就是PLC接收上位机的参数,并回复工程数据至上位机。在PLC的初始化程序中和上位机程序,必须是同类的通讯物理接口中,必须定义相同的通讯参数。 本工程的通讯参数:RS-485,9600,8,N,1,表2、表3是自由通讯口协议的格式及功能工程意义。
通讯协议---上位机(VB代码)发送:
表2:上位机发送数据
在PLC接收到CRC-ID校验码和在字头AAH相等时,回复以下应答数据经上位机:
通讯协议---下位机(PLC)回复:
表3:PLC回复--发送数据
PLC程序代码只介绍这些。
上位监控软件用Visual Basic 6.0开发,PLC与上位机之间RS485串口连接,软件中的核心部分是COMMUNICATION控件的源程序编制,对COMUNICATION控件编写源代码,和PLC程序相同,COMMUNICATION控件需要进行初始化编程,定义定时器和中断等功能意义,由于VB源代码有文字注释,这里不再重复解释。 '************************************************ '接收数据成功--16HAA 通讯识别号相等后,通讯成功接数据--初始化设置 '自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 '上位机发送:AAH D1 D2 D3 D4 D5 D6 COMID 其中:COMID= D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; '下位机应答:AAH B1 B1 B3 B4 B5 B6 COMID 其中:COMID= B1 XOR B2 XOR B3 XOR B4 XOR B5 XOR B6; '************************************************ 'SMB30: 通讯端口0, 00 0 010 00 09H 自由通讯模式,9600 不校验,8位; 'SMB87: 通讯端口0, 1011 0000 B0H 接收信息状态字; 'SMB90: 通讯端口0, 空闲时间按线设置; 'SMB94: 通讯端口0, 要接收的最大字符数; '************************************************ Private Sub Form_Load() '系统初始化 '************************************************ MSComm1.CommPort = Val(Form5.Text4.Text) '定义端口1 MSComm1.Settings = "9600,N,8,1" '设置波特率,较验位和停止位 MSComm1.InputLen = 0 '读接收缓冲区的所需要的数据 '************************************************* MSComm1.Handshaking = comNone '无握手协议 MSComm1.RTSEnable = False '置为发送状态' '************************************************ MSComm1.SThreshold = 0 '发送时不触发ONCOMM事件 MSComm1.RThreshold = 8 '接收8位数时触发ONCOMM事件 MSComm1.InBufferSize = 512 ' MSComm1.OutBufferSize = 512 ' MSComm1.OutBufferCount = 0 '清发送缓冲区 MSComm1.InBufferCount = 0 '清接收缓冲区 '************************************************ MSComm1.EOFEnable = False ' MSComm1.InputMode = comInputModeBinary '接收以二进制形式 INdata = 0 INarray = 0 QTarray = 0 MSComm1.InBufferCount = 0 '接收区清零 '************************************************* JD00 = 48 '角度数据清零 RG11 = 0 '压力--1数据清零 RG22 = 0 '压力--2数据清零 RG33 = 0 '压力PA数据清零 RG44 = 0 '压力PB数据清零 XY00 = 0 XY88 = 0 COM88 = 0 '通讯计数清零 '************************************************ On Error GoTo F1END '跳转指令 '************************************************ MSComm1.PortOpen = True '打开通讯端口 F1END: Form5.Show '重新设置通讯端口 '************************************************ End Sub '子程序结束 '************************************************
定时中断程序:用TIMER1作定时循环,调用子程序和其他函数块,方式、方法详见源代码注释:
'************************************************ '上位机发送数据 '接收数据成功--16HAA 通讯识别号相等后,通讯成功接数据 '自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 '上位机发送:AAH D1 D2 D3 D4 D5 D6 COMID 其中:COMID= D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; '下位机应答:AAH B1 B1 B3 B4 B5 B6 COMID 其中:COMID= B1 XOR B2 XOR B3 XOR B4 XOR B5 XOR B6; '************************************************ Private Sub Timer1_Timer() '发送数据 '************************************************ Dim QTarray(8) As Byte '通讯数据接收、发送 '************************************************ REG10 = XY00 '记录序号 REG20 = XY66 '通讯端口号 REG30 = Val(Form1.COM88) '通讯故障 REG40 = XY00 '指令--1 REG50 = XY88 '指令--2 REG60 = &H0 '指令--3 REG70 = REG10 Xor REG20 Xor REG30 Xor REG40 Xor REG50 Xor REG60 '************************************************ QTarray(0) = &HAA '字头AA/BB QTarray(1) = REG10 '记录序号 QTarray(2) = REG20 '通讯端口号 QTarray(3) = REG30 '通讯故障 QTarray(4) = REG40 '指令--1 QTarray(5) = REG50 '指令--2 QTarray(6) = REG60 '指令--3 QTarray(7) = REG70 '通讯识别号 '************************************************ MSComm1.Output = QTarray MSComm1.RThreshold = 8 '接收字符数共8个,后开始触发通讯控件 '************************************************ COM88 = COM88 + 1 '通讯端口计数 End Sub '子程序结束 '***************************************************
结合上述解释的自定义协议,上位机到PLC的发送的几个字节数据后,触发串口中断,形成通讯事件,程序进入接收数据处理,VB软件COMMUNICATION控件有丰富的功能寄存器,供通讯供通讯源代码编写。 '************************************************ '接收数据成功--16HAA 通讯识别号相等后,通讯成功接数据 '自由通讯协议,通讯参数:9600,8,N,1,S7-200PLC为应答方式,通讯发送数据,十六进制数据格式 '上位机发送:AAH D1 D2 D3 D4 D5 D6 COMID 其中:COMID= D1 XOR D2 XOR D3 XOR D4 XOR D5 XOR D6; '下位机应答:AAH B1 B1 B3 B4 B5 B6 COMID 其中:COMID= B1 XOR B2 XOR B3 XOR B4 XOR B5 XOR B6; '************************************************ Private Sub MSComm1_OnComm() '通讯事件 中断接收数据处理 Dim INdata As Variant Select Case MSComm1.CommEvent '************************************************ Case comEventBreak '接收中断信号,发送缓冲区中的字符数少于STHRESHOLD Form1.Text4.Text = "通讯异常--1,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventCDTO 'CARRIER DECET 超时 Form1.Text4.Text = "通讯异常--2,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventCTSTO 'CLEAR TO SEND 超时 Form1.Text4.Text = "通讯异常--3,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventDSRTO 'DATA-SET 超时 Form1.Text4.Text = "通讯异常--4,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventFrame '帧错误 'Form1.Text4.Text = "通讯异常--5,请检查!" '显示通讯故障 'Form1.Text4.ForeColor = vbRed '************************************************ Case comEventOverrun '端口超速 Form1.Text4.Text = "通讯异常--6,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventRxOver '接收缓冲区溢出 Form1.Text4.Text = "通讯异常--7,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventRxParity 'PARITY 错误 Form1.Text4.Text = "通讯异常--8,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventTxFull '传输缓冲区满 Form1.Text4.Text = "通讯异常--9,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEventDCB '检索端口,设备控制块(DCB)时的意外错误 Form1.Text4.Text = "通讯异常--10,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEvCD 'CD信号发生变化 Form1.Text4.Text = "通讯异常--11,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEvCTS 'CTS信号发生变化 Form1.Text4.Text = "通讯异常--12,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEvDSR 'DSR信号发生变化,DSR(1>0)时发生 Form1.Text4.Text = "通讯异常--13,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEvRing '检测到电话振铃 Form1.Text4.Text = "通讯异常--14,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEvSend '发送缓冲区中的字符数少于STHRESHOLD Form1.Text4.Text = "通讯异常--15,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ Case comEvEOF '接收文件结束 Form1.Text4.Text = "通讯异常--16,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '************************************************ '正确接收程序 '************************************************ Case comEvReceive '接收RTHRESHOLD个字符,在使用INPUT属性移去接收缓冲区之前,该事件将持续产生 INdata = MSComm1.Input '从缓冲区中读取数据 INarray = INdata '存放数组 '************************************************ Call RECVD '数据处理子程序 '************************************************ Form1.Text4.Text = "通讯端口功能正常……" '显示通讯正常 Form1.Text4.ForeColor = vbBlue End Select '************************************************ End Sub '子程序结束 '************************************************ 接下来的内容叙述“Call RECVD ”数据处理子程序,代码如下: '************************************************ Public Sub RECVD() '接收后数据处理子程序 '*************************************************** DT00 = INarray(0) '字头AA/BB DT01 = INarray(1) '角度低八位 DT02 = INarray(2) '角度高八位 DT03 = INarray(3) 'PA压力--信号 DT04 = INarray(4) 'PB压力--信号 DT05 = INarray(5) '记录开始指令 DT06 = INarray(6) '记录停止指令 DT07 = INarray(7) '记录停止指令
REG70 = DT01 Xor DT02 Xor DT03 Xor DT04 Xor DT05 Xor DT06 '************************************************ If (DT00 = &HAA) And (REG70 = DT07) Then '*****************************************'读值开始 JD00 = Val(DT01) * 1 '角度 13~88=75 RG11 = Val(DT02) * 1.2 '压力--1信号 RG22 = Val(DT03) * 1.2 '压力--2信号 RG33 = Val(DT04) * 1.2 'PA压力--信号 RG44 = Val(DT05) * 1.2 'PB压力--信号 REG80 = Val(DT05) '记录开始指令 '********************************************** COM88 = 0 '通讯计数 Else End If '************************************************ End Sub '子程序结束
自由通讯协议通讯的发送与接收,上位机接收的先做数组保存,显示时,直接调用,接下来是数据处理与存储,绘制数据趋势图等。 '************************************************ '定时器2,延时发送通讯数据 '相关数据显示及处理、调试' '************************************************ Private Sub Timer2_Timer() '主循环程序,定时0.2秒循环一周 '************************************************ If JD88 >= 32 Then JD88 = (JD00 - 48) * 1.1 Else JD88 = (JD00 - 48) * 1.2 End If '************************************************ Form1.Text1.Text = "摆缸角度 : " & JD88 * 1.285 & " 度" '摆缸角度数据 Form1.Text1.Visible = True '************************************************ Form1.Text6.Text = "压力--1: " & RG11 * 1 & " Pa" ' 摆动缸压力--1 Form1.Text6.Visible = True '************************************************ Form1.Text7.Text = "压力--2: " & RG22 * 1 & " Pa" ' 摆动缸压力--2 Form1.Text7.Visible = True '************************************************ Form1.Text2.Text = "PA侧压力: " & RG33 * 1 & " Pa" ' 摆动缸PA侧压力 Form1.Text2.Visible = True '************************************************ Form1.Text3.Text = "PB侧压力: " & RG44 * 1 & " Pa" ' 摆动缸PB侧压力 Form1.Text3.Visible = True '************************************************ Form1.Text5.Text = Format(Date, "dddddd") & " " & Format(Time, Form1.Tag) '显示日期、时间 '************************************************ If REG80 = 88 Then '*************************************************** 'Form1.Timer3.Enabled = True 'Form2.Timer1.Enabled = True 'Form3.Timer1.Enabled = True 'Command1.BackColor = vbGreen 'Command1.Caption = "正在记录…" 'Command2.BackColor = vbYellow 'Command2.Caption = "暂停记录" 'Command2.Visible = False '*************************************************** Else '*************************************************** 'Form1.Timer3.Enabled = False 'Form2.Timer1.Enabled = False 'Form3.Timer1.Enabled = False 'Command1.BackColor = vbYellow 'Command1.Caption = "开始记录" 'Command2.BackColor = vbGreen 'Command2.Caption = "记录停止" 'Command2.Visible = True End If '*************************************************** '通讯故障数据处理 '*************************************************** If COM88 >= 20 Then '通讯计数 '*************************************************** Form1.Text4.Text = "通讯异常--00,请检查!" '显示通讯故障 Form1.Text4.ForeColor = vbRed '*************************************************** Else Form1.Text4.Text = "通讯端口功能正常……" '显示通讯正常 Form1.Text4.ForeColor = vbBlue End If '*************************************************** If COM88 >= 30 Then '通讯计数 '*************************************************** Load Form10 '*************************************************** COM88 = 0 '*************************************************** End If End Sub '子程序结束,返回 '***************************************************
数据保存程序,做一个函数块使用。
'*************************************************** Public Sub ARRDT() '动态显示数组 '*************************************************** For i = 1 To 80 SD00(i) = SD00(i + 1) SD22(i) = SD22(i + 1) SD44(i) = SD44(i + 1) SD66(i) = SD66(i + 1) SD88(i) = SD88(i + 1) Next i '*************************************************** SD00(80) = Form1.JD88 * 1.285 '保存角度40个数据 SD22(80) = Form1.RG33 '保存PA压力40个数据 SD44(80) = Form1.RG44 '保存PB压力40个数据 SD66(80) = Form1.RG11 '保存压力--1,40个数据 SD88(80) = Form1.RG22 '保存压力--1,40个数据 '*************************************************** SD00(81) = Form1.JD88 * 1.285 '保存角度40个数据 SD22(81) = Form1.RG33 '保存PA压力40个数据 SD44(81) = Form1.RG44 '保存PB压力40个数据 SD66(81) = Form1.RG11 '保存压力--1,40个数据 SD88(81) = Form1.RG22 '保存压力--1,40个数据 '*************************************************** SD00(0) = SD00(1) SD22(0) = SD22(1) SD44(0) = SD44(1) SD66(0) = SD66(1) SD88(0) = SD88(1) End Sub '*************************************************** Private Sub PICT1() '*************************************************** Dim X2 As Byte '************************************************对称比例及纵横坐标尺寸 Picture1.Scale (-50, 50)-(850, -250) '************************************************零位对称点、横向坐标直线 For I1 = 1 To 21 Call AA(I1 * 10 - 10) Next I1 '************************************************纵向坐标直线 For I2 = 1 To 41 Call BB(I2 * 20 - 20) Next I2 '************************************************横坐标标识 For I3 = 1 To 41 Picture1.CurrentX = (I3 - 1) * 20 - 10 Picture1.CurrentY = -205 Picture1.Print 80 - (I3 - 1) * 2 '************************************************ Next I3 '************************************************纵向刻度---角度左侧 For I4 = 1 To 21 Picture1.CurrentX = -30 Picture1.CurrentY = -(I4 - 1) * 10 + 5 Picture1.Print 100 - (I4 - 1) * 10 '************************************************ Next I4 '************************************************纵向刻度---压力右侧 For I5 = 1 To 21 Picture1.CurrentX = 800 Picture1.CurrentY = -(I5 - 1) * 10 + 5 Picture1.Print 200 - (I5 - 1) * 10 '************************************************ Next I5 '************************************************左上角单位 Picture1.CurrentX = -25 Picture1.CurrentY = 12 Picture1.Print "角度:±°" '************************************************右上角单位 Picture1.CurrentX = 770 Picture1.CurrentY = 12 Picture1.Print "压力:Pa" '************************************************上行标识栏 Picture1.CurrentX = 120 Picture1.CurrentY = 20 Picture1.Print "伊 卡 路 斯 (苏州) 车 辆 系 统 有 限 公 司 -- 汽 车 摆 动 缸 测 试 实 时 数 据 趋 势 图" '************************************************下行标识栏 Picture1.CurrentX = 0 Picture1.CurrentY = -220 Picture1.Print "注1:棕色:角度曲线 " '************************************************标识线 Picture1.Line (130, -223)-(160, -223), vbbrown '角度:棕色线标识 Picture1.Line (130, -225)-(160, -225), vbbrown '************************************************标识线 Picture1.CurrentX = 180 Picture1.CurrentY = -220 Picture1.Print "蓝色:PA压力曲线 " Picture1.Line (300, -223)-(330, -223), vbBlue 'PA压力:蓝色线标识 Picture1.Line (300, -225)-(330, -225), vbBlue '************************************************标识线 Picture1.CurrentX = 360 Picture1.CurrentY = -220 Picture1.Print "红色:PB压力曲线 时 间 范 围: 0 ~ 80 秒 " Picture1.Line (480, -223)-(510, -223), vbRed 'PB压力:红色线标识 Picture1.Line (480, -225)-(510, -225), vbRed '************************************************ For i8 = 1 To 80 '************************************************角度曲线 If Form1.Check1 = 0 Then Picture1.Line ((i8 - 1) * 10, -100 + Val(SD00(i8)) + 0.25)-(i8 * 10, -100 + Val(SD00(i8 + 1)) + 0.25), vbbrown Picture1.Line ((i8 - 1) * 10, -100 + Val(SD00(i8)) - 0.25)-(i8 * 10, -100 + Val(SD00(i8 + 1)) - 0.25), vbbrown End If '************************************************PA压力曲线 If Form1.Check2 = 0 Then Picture1.Line ((i8 - 1) * 10, -200 + Val(SD22(i8)) + 0.25)-(i8 * 10, -200 + Val(SD22(i8 + 1)) + 0.25), vbBlue Picture1.Line ((i8 - 1) * 10, -200 + Val(SD22(i8)) - 0.25)-(i8 * 10, -200 + Val(SD22(i8 + 1)) - 0.25), vbBlue End If '************************************************PB压力曲线 If Form1.Check3 = 0 Then Picture1.Line ((i8 - 1) * 10, -200 + Val(SD44(i8)) + 0.25)-(i8 * 10, -200 + Val(SD44(i8 + 1)) + 0.25), vbRed Picture1.Line ((i8 - 1) * 10, -200 + Val(SD44(i8)) - 0.25)-(i8 * 10, -200 + Val(SD44(i8 + 1)) - 0.25), vbRed End If '************************************************压力曲线--1 If Form1.Check4 = 0 Then Picture1.Line ((i8 - 1) * 10, -200 + Val(SD66(i8)) + 0.25)-(i8 * 10, -200 + Val(SD66(i8 + 1)) + 0.25), vbRed Picture1.Line ((i8 - 1) * 10, -200 + Val(SD66(i8)) - 0.25)-(i8 * 10, -200 + Val(SD66(i8 + 1)) - 0.25), vbRed End If '************************************************压力曲线--2 If Form1.Check5 = 0 Then Picture1.Line ((i8 - 1) * 10, -200 + Val(SD88(i8)) + 0.25)-(i8 * 10, -200 + Val(SD88(i8 + 1)) + 0.25), vbBlue Picture1.Line ((i8 - 1) * 10, -200 + Val(SD88(i8)) - 0.25)-(i8 * 10, -200 + Val(SD88(i8 + 1)) - 0.25), vbBlue End If Next i8 '************************************************标识线 End Sub '*************************************************** Private Sub Timer3_Timer() Picture1.Cls '************************************************ If XY66 >= 1 Then XY66 = 0 Call ARRDT '数据处理-- 记录相关40个数据 '************************************************ Else XY66 = XY66 + 1 End If '************************************************ Call PICT1 If XY00 >= 100 Then '发送站号 XY88 = 0 XY00 = 0 Else XY00 = XY00 + 2 XY88 = XY88 + 1.5 End If End Sub '************************************************过程函数(左右画横线) Public Sub AA(i As Variant) '************************************************ Picture1.Line (0, -i)-(800, -i), vbGreen '************************************************ End Sub '************************************************过程函数(纵向,三条竖线) Public Sub BB(i As Variant) '************************************************ Picture1.Line (i, 0)-(i, -200), vbGreen 'PA纵向 '************************************************ End Sub
本文是根据实际工程案例应用技术进行汇总整理出来的,以工程技术应用参考。
(作者简介:周海清,苏州嘉海电子科技有限公司技术部工程师,从事单片机及工业自动化设计开发多年,熟悉单片机硬件开发和汇编语言编程,熟悉国内外大多品牌的PLC及组态软件开发。典型的项目有上海洋山深水港振冲数据记录仪及监控软件,中航科技集团五院510所钟房实验室恒温控制系统及记录软件等,联系电话:0512-67314880 13913126729)
二〇二一年〇二月于苏州
|
(工信部备案/许可证编号: 苏ICP备09088433号 )
系统更新时间:2022-03-01 08:00