| 喻 慧 ,马 岩 (陕西恒鑫精密纺织机械有限公司)     摘要: 目前纺织业生产中产品产量一般都还是依靠人工进行统计,在实际操作过程中,不仅麻烦而且容易出错。因此,有必要采用产量监控及查询系统对产品产量进行统计。本文介绍了基于VB及台达触摸屏的产量监控及查询系统,该系统不仅能应用于纺织机械,而且适用于其它设备。     关键词: 台达触摸屏;VB;监控;查询;MODBUS;MSCOMM 一、引言
     该系统用于对各生产线的纺机进行实时监控和查询,并对各班次产量数据进行存储,用户可通过日期时间段、车号、班次等对产量进行综合查询,并进行统计,可在查询出满足条件的数据后,进行报表输出和打印。以下是对系统设计方面的一些讨论。 二、系统结构与功能     精梳机是近年来在纺织行业使用较为普遍的一种设备,其主要作用是排出梳棉生条中一定长度以下的短纤维,提高纤维整齐度,进一步清除纤维中残留的棉结、杂质,提高纤维光洁度。条并卷联合机是精梳工序的准备设备,通常情况下,一套精梳设备由一台条并卷联合机和五台精梳机组成。该产量监控查询系统应用于精梳设备的结构示意图如下所示: 
 该系统实现了以下功能:  1)实时监控所选机器各班次的当日产量和累计产量以及该机器的运行情况。 2)可定时保存各机器各班次的当日产量及累计产量,且有多种定时方式可选择。 3)能分别根据时间,班次,产量,车号进行查询操作,也可综合考虑数据保存方式进行查询,提高查询准确率。 4)查询结果可显示为报表格式,并可将结果打印输出,方便用户使用。 5)具有系统维护功能,可方便用户进行数据维护。 三、系统设计 1)硬件配置 
| 名称 | 数量 |  
| 触摸屏 | 7 |  
| 普通PC机 | 1 |  
| 转换模块RS232—RS485 | 1 |    2) 数据采集部分的设计     触摸屏选用台达系列AE10THTD型,由于其具有强大的通讯功能,灵活的系统构成,生动逼真且丰富的图库,简单易用等特点,在纺织业中得到了广泛的应用,因此通过触摸屏来采集所需数据。所以要对纺机进行实时监控,首先要解决触摸屏与PC的通信问题。所用的台达触摸屏支持标准的MODBUS协议,通过串口与PC相连。 <1>MODBUS通信协议 modbus功能码 01:读取线圈状态  取得一组逻辑线圈的当前状态(ON/OFF) 02:读取输入状态  取得一组开关输入的当前状态(ON/OFF) 03:读取保持寄存器  在一个或多个保持寄存器中取得当前的二进制值 04:读取输入寄存器  在一个或多个输入寄存器中取得当前的二进制值 05:强置单线圈  强置一个逻辑线圈的通断状态 06:预置单线圈  把具体二进制值装入一个保持寄存器 根据modbus协议,通信中mscomm1.output中包含的字符串应包括以下几部分: 起始位  站号  功能码  数据位  校验位  停止位  在此通信中,站号表示人机站号 数据位包括寄存器地址和数据 <2> HMI内部地址与MODBUS地址映射表 
| MODBUS_ADDRESS | HMI_ADDRESS | PC_ADDRESS | 描述 |  
| W40001-W41024 | $0-$1023 | 0000-03FF | 内部寄存器 |  
| W42001-W43024 | $M0-$M1023 | 07D0-0BCF | 断电保持内部寄存器 |  
| W44001 | RCPN0 | 0FA0 | 配方编号寄存器 |  
| W45001-...... | RCP0-RCPn | 1388-...... | 配方寄存器 |  
| B00001-B01024 | $2000.0-$2063.15 | 0000-03FF | 内部寄存器(bit) |  
| B01025-B02048 | $M200.0-$M263.15 | 0400-07FB | 断电内部保持寄存器(bit) |  <3>mscomm控件 CommPort 设置并返回通讯端口号。  Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。  PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。  Input 从接收缓冲区返回和删除字符。  Output 向传输缓冲区写一个字符串。 <4>HMI与PC的通信及数据采集的设计 LRC算法函数: Public Function LRC(str)     c = 0     l = Len(str) ’求出str的长度赋值给l         For c = c + 1 To l     c_data = Mid$(str, c, 2) ’在str串中,从c的值开始取2个字符。     d_lrc = d_lrc + Val("&H" + c_data)     c = c + 1     Next c     If d_lrc > &HFF Then        d_lrc = d_lrc Mod &H100     End If     h_lrc = Hex(&HFF - d_lrc + 1)     If Len(h_lrc) > 2 Then        h_lrc = Mid(h_lrc, Len(h_lrc) - 1, 2)     End If     LRC = h_lrc End Function 下面对数据进行实时采集,数据采集程序界面如下图所示:
 
 Private Sub Timer1_Timer()     ’连接数据库     Dim CONN As New ADODB.Connection     Dim DBStr As String     Dim rs As New ADODB.Recordset     DBStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\data.mdb;Persist Security Info=False"     CONN.Open DBStr     Dim Mac_Num    ’ Mac_Num是车号     Mac_Num = Combo_MacNum.List(Combo_MacNum.ListIndex)     Debug.Print Mac_Num     sql = "select * from machine where Machine_Num = ’" + Mac_Num + "’"   ’获取车号     rs.Open sql, CONN, 1, 3     Txt_type.Text = rs.Fields("machine_type").Value   ’获取车的类型(是精梳机还是条并联)     rs.Close     str_type = Mac_Num  ’     Set CONN = Nothing     DBStr = ""     ’发送数据(根据所选车号发送数据)     If MSComm1.PortOpen = True And stakeout_flag And Combo_MacNum.ListIndex >= 0 Then         str_output = str_type + "030064001D"         MSComm1.Output = ":" + str_output + LRC(str_output) + Chr$(13) + Chr$(10)         ’接收数据         inputstring = MSComm1.Input         ’将接收到的数据分别赋值并显示         Txt_100.Text = change(inputstring, 8, 12) ’甲班当日产量         Txt_102.Text = change(inputstring, 16, 20) ’甲班累计产量         Txt_104.Text = change(inputstring, 24, 28) ’乙班当日产量         Txt_106.Text = change(inputstring, 32, 36) ’乙班累计产量         Txt_108.Text = change(inputstring, 40, 44) ’丙班当日产量         Txt_110.Text = change(inputstring, 48, 52) ’丙班累计产量         Txt_112.Text = change(inputstring, 56, 60) ’丁班当日产量         Txt_114.Text = change(inputstring, 64, 68) ’丁班累计产量         Txt_116.Text = change(inputstring, 72, 76) ’各班当日合计产量         Txt_118.Text = change(inputstring, 80, 84) ’各班累计合计产量         If Txt_type.Text = "条并联" Then             Txt_view1.Text = change(inputstring, 104, 108) ’条并联绕卷速度             Txt_view2.Text = change(inputstring, 112, 116) ’条并联当前长度         Else             Txt_view1.Text = change(inputstring, 88, 92) ’精梳机钳次             Txt_view2.Text = change(inputstring, 96, 100) ’精梳机条速       End If       str_state = Mid(inputstring, 120, 4) ’接收运行状态的返回值,并判断运行状态         If str_state = "0001" Then             Cmd_128.Caption = "运行中"         End If         If str_state = "0000" Then             Cmd_128.Caption = "停止"         End If    End If End Sub     change(inputstr, start1 As Integer, start2 As Integer)用于转换采集到的数据,其功能是将采集到的产量数据转换为十进制。其代码如下: Public Function change(inputstr, start1 As Integer, start2 As Integer)     str_low = Mid(inputstr, start1, 4) ’读寄存器中的数据赋给低字节     str_high = Mid(inputstr, start2, 4) ’读寄存器中的数据赋给高字节     str_hex = str_high + str_low ’整合高低字节数据     str_input = Val("&H" + str_hex) ’将十六进制数据转换成十进制     If str_input >= -32768 And str_input <= -1 Then ’将转换成十进制处于-32768~32767的数据转换为相应的正数         str_input = str_input + 65536     End If     change = str_input / 1000 ’返回值 取三位小数 End Function 3)信息查询     信息查询界面如下所示,可对已经保存的生产数据根据时间、班次、产量、车号进行综合查询。
 
     该功能的程序方面比较简单,主要是对数据库的查询操作。以单独对班次查询为例,其代码如下: ’按班次查询子函数,用于判断其搜索关键字是否有效 Private Sub Chk_team_Click()     If Chk_team.Value = 1 Then         Combo_team.Enabled = True     Else         Combo_team.Enabled = False     End If End Sub ’选择班次子函数,用于判断所选班次 Private Sub Combo_team_Click()     Dim liner_str     Select Case Combo_team.ListIndex         Case 0             liner_str = "甲班"         Case 1             liner_str = "乙班"         Case 2             liner_str = "丙班"         Case 3             liner_str = "丁班"     End Select End Sub 
 |