VB与AB的PLC之间通讯
- 格式:doc
- 大小:29.50 KB
- 文档页数:5
VB与PLC通信程序(欧姆龙PLC)关于VB的MSCOMM控件可参考相关资料。
通信程序摘要如下:(1)初始化程序mport=2 ’选择COM2Mscomm1.Settings=”9600,N,8,2”’设置通信参数Mscomm1.Inputlen=0 ’读入接收缓冲区全部字符Mscomm1.OutbufferSize=256 ’设置发送缓冲区大小Mscomm1.InbufferSize=512 ’设置接收缓冲区大小Mscomm1.PortOpen=True ’打开COM2(2)发送命令程序比如读取节点号03的PLC中IR000到IR009的内容,并放到tag1字符串变量中,此时有:Dim Command, node, begin, number as stringDim Answerlen as integernode=”03”’节点号Command=”RR”’命令为读IR区begin=”0000”’从IR000开始number=10 ’读取长度Answerlen=51 ’计算接收字符串长度进行命令发送和接收应答处理:Dim FCS, I as integerDim s ,f as strings=”@”+node+Commad+begin+numberFCS=0For i=1 to Len(s)FCS=FCS xor Asc(Mid$(s,i,1) ) ’帧校验码FCSNext if=Hex$(FCS)If Len(f)=1 Then f=”0”+fCommfrm.MSComm1.Output=s + f + ”*” + CHR$(13) ’命令帧发送DoDummy=DoEvents()Loop Untill Commfrm.MSComm1.InbufferCount >= Answerlen ’等待应答帧Do tag1= Commfrm.MSComm1.InputLoop Untill Commfrm.MSComm1.InbufferCount=0 ’读完应答帧上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。
Private Sub MSComm1_OnComm()Select Case mEventCase comEvReceive'此处添加处理接收的代码End SelectEnd Sub'发送主代码frmMain.MSComm1.Output = bytSendByte在使用MSComm控件时需注意接收是以ASCII码或二进制码详细可参阅“人名邮电出版社”的“VISUAL BASIC 串口通讯实例导航”一书。
按你提供的C2C7FAE1看为16进制数,其10进制值为-1027081503,如何处理成-99.99要看下位机是如何约定数据的来定.Text1 = &HC2C7FAE1 或Text1 = VAL(&HC2C7FAE1)一般上下位机对数字值传递通常以16位二进制数字传递,而小数点不传递,仅乘一定倍率来实现.同时16位二进制数字按两个8位(ASCII码值)输送,上位机通过程序代码处理成10进制数.串口传送数据实质是传送ASCII码,如是8位二进制数据,其ASCII码值(10进制)为0-255。
用二进制表示为00000000 - 1111111116进制表示为00 - FF传送数据大于255,则用16位二进制(即2字节ASCII码组成)。
10进制范围-32768到+32767。
如有小数,则应由上下位机约定,不进行发送。
串口通信中数制转换必须相当重视。
以上是以二进制方式收发数据。
也可直接以ASCII码的文本方式发送数据,而字节量大。
如何实现串口数据采集,如何分析这些数据?MSCOMM控件在VB6的企业版中有,需通过部件添加方式加载。
Private Sub MSComm_OnComm()Dim bytInput() As ByteDim intInputLen As IntegerSelect Case mEventCase comEvReceiveIf blnReceiveFlag ThenIf Not frmMain.ctrMSComm.PortOpen ThenmPort = intPortfrmMain.ctrMSComm.Settings = strSetfrmMain.ctrMSComm.PortOpen = TrueEnd If'此处添加处理接收的代码frmMain.ctrMSComm.InputMode = comInputModeText '按ASCII 接收intInputLen = frmMain.ctrMSComm.InBufferCountReDim bytInput(intInputLen)bytInput = frmMain.ctrMSComm.InputText1 = bytInputText2 = Text1jscd = Len(Text1)If Left(Text1, 1) <> Chr(27) Or jscd > 25 Then 'bel3.BackColor = vbRedbel3.ForeColor = vbWhitebel3.Caption = "接收信号出错!"ElseIf Left(Text2, 1) = Chr(27) And Mid(Text2, 25, 1) = Chr(13) Thenbel3.BackColor = vbGreenbel3.ForeColor = vbBlackbel3.Caption = "接收信号正常!"If Left(Text2, 6) = Chr(27) & "R0032" And jscd = 25 ThenIf Val(fa2) >= 0 And Len(fa2) = 4 Thenfa2 = "0" & Mid(fa2, 2, 3)End IffrmMain.txtSend = Chr(27) & fa0 & fa1 & "9999" & zhenkong & fa2 & fa3 & fa4 & Chr(13)lenTxtSend = Len(txtSend)bel8.Caption = txtSendbel11.Caption = lenTxtSendIf lenTxtSend = 24 ThenCall commFasongElsebel3.BackColor = vbRedbel3.ForeColor = vbWhitebel3.Caption = "发送信号出错!"End IfblL1 = Mid$(Text2, 19, 2)If blL1 = "01" Thenrecord_jmm(0) = Val(Mid$(Text2, 21, 4)) / 10 '制品1温度ElseIf blL1 = "02" Thenrecord_jmm(1) = Val(Mid$(Text2, 21, 4)) / 10 '制品2温度ElseIf blL1 = "03" Thenrecord_jmm(2) = Val(Mid$(Text2, 21, 4)) / 10 '制品3温度ElseIf blL1 = "04" Thenrecord_jmm(3) = Val(Mid$(Text2, 21, 4)) / 10 '制品4温度ElseIf blL1 = "05" Thenrecord_jmm(4) = Val(Mid$(Text2, 21, 4)) / 10 '制品5温度ElseIf blL1 = "06" Thenrecord_jmm(5) = Val(Mid$(Text2, 21, 4)) / 10 '制品6温度End Ifrecord_jm(0) = Val(record_jmm(0))record_jm(1) = Val(record_jmm(1))record_jm(2) = Val(record_jmm(2))record_jm(3) = Val(record_jmm(3))record_jm(4) = Val(record_jmm(4))record_jm(5) = Val(record_jmm(5))blL = Mid$(Text2, 7, 6)Call Hex_bin '输出口状态鉴别blLg = Mid$(Text2, 13, 6)Call hex_bin1 '输出口故障状态鉴别txtSend = ""ElsetxtSend = ""End IfEnd IfIf Not blnAutoSendFlag And Not blnReceiveFlag ThenfrmMain.ctrMSComm.PortOpen = FalseEnd IfEnd IfEnd SelectEnd Sub以上是一段MSCOMM的ONCOMM事件代码,接收的数据按上下位机约定取出赋值于全局变量,在其它窗体进行数据记录(写入数据库).至于数据分析确如一楼说的可以海阔天空,通过数据控件及SQL语句来完成任务.以下提供MSDN参考:OnComm 常数常数值描述comEvSend 1 发送事件。
VB与AB的PLC之间通讯 31VB与AB的PLC之间通讯;VB与ABPLC之间通讯;AB系列PLC一般都有专用驱动程序用于实现PLC;OptionExplicit;Dimtns%,comunicating;PrivateS ubCommand1_Click;ReDimtb%(10);Dimst;IfReadTable(0,tb%())Then;Fors t=0To9'显示结果;TexVB与AB的PLC之间通讯VB与ABPLC之间通讯AB系列PLC一般都有专用驱动程序用于实现PLC和计算机之间通讯,如RS LINX就是专门用于做这项工作,但使用RSLINX也具有一定局限性,这里提供一个使用VB编程实现PLC和计算机之间通讯程序,使用协议是DF1,可以支持Mi crologix、SLC500等系列PLC。
使用代码如下:Option ExplicitDim tns%, comunicatingPrivate Sub Command1_Click()ReDim tb%(10)Dim stIf ReadTable(0, tb%()) ThenFor st = 0 To 9 '显示结果Text1.SelText = Str(tb%(st)) + Chr(32)Next stText1.SelText = Chr(13) + Chr(10)End IfEnd SubPrivate Sub Command2_Click()ReDim tm%(5)tm%(0) = Rnd * 32768tm%(1) = Rnd * 32768tm%(2) = Rnd * 32768tm%(3) = Rnd * 32768tm%(4) = Rnd * 32768If Not WriteTable(4, tm%()) Then Text1.SelText = "写入错误!!" E nd SubPrivate Sub Exit_Click()Unload MeEndEnd SubPrivate Sub Form_Load()Comm1.PortOpen = TrueEnd SubPrivate Sub Form_Unload(Cancel As Integer) Comm1.PortOpen = FalseEnd SubPrivate Sub CalcCRC(mes$)Dim byt%, res&'对消息进行crc校验,然后将结果添加到消息结尾。
vba实现将记录集输出到Excel模板'************************************************'** 函数名称: ExportTempletToExcel'** 函数功能: 将记录集输出到Excel 模板'** 参数说明:'** strExcelFile 要保存的Excel 文件'** strSQL 查询语句,就是要导出哪些内容'** strSheetName 工作表名称'** adoConn 已经打开的数据库连接'** 函数返回:'** Boolean 类型'** True 成功导出模板'** False 失败'** 参考实例:'** Call ExportTempletToExcel(c:\\text.xls,查询语句,工作表1,adoConn) '************************************************Private Function ExportTempletToExcel(ByVal strExcelFile As String, _ ByVal strSQL As String, _ByVal strSheetName As String, _ByVal adoConn As Object) As BooleanDim adoRt As ObjectDim lngRecordCount As Long ' 记录数Dim intFieldCount As Integer ' 字段数Dim strFields As String ' 所有字段名Dim i As IntegerDim exlApplication As Object ' Excel 实例Dim exlBook As Object ' Excel 工作区Dim exlSheet As Object ' Excel 当前要操作的工作表On Error GoTo LocalErrMe.MousePointer = vbHourglass'// 创建ADO 记录集对象Set adoRt = CreateObject(ADODB.Recordset)With adoRt.ActiveConnection = adoConn.CursorLocation = 3 'adUseClient.CursorType = 3 'adOpenStatic.LockType = 1 'adLockReadOnly.Source = strSQL.OpenIf .EOF And .BOF ThenExportTempletToExcel = FalseElse'// 取得记录总数,+ 1 是表示还有一行字段名名称信息lngRecordCount = .RecordCount + 1intFieldCount = .Fields.Count - 1For i = 0 To intFieldCount'// 生成字段名信息(vbTab 在Excel 里表示每个单元格之间的间隔)strFields = strFields & .Fields(i).Name & vbTabNext'// 去掉最后一个vbTab 制表符strFields = Left$(strFields, Len(strFields) - Len(vbTab))'// 创建Excel实例Set exlApplication = CreateObject(Excel.Application)'// 增加一个工作区Set exlBook = exlApplication.Workbooks.Add'// 设置当前工作区为第一个工作表(默认会有3个)Set exlSheet = exlBook.Worksheets(1)'// 将第一个工作表改成指定的名称 = strSheetName'// 清除“剪切板”Clipboard.Clear'// 将字段名称复制到“剪切板”Clipboard.SetText strFields'// 选中A1单元格exlSheet.Range(A1).Select'// 粘贴字段名称exlSheet.Paste'// 从A2开始复制记录集exlSheet.Range(A2).CopyFromRecordset adoRt'// 增加一个命名范围,作用是在导入时所需的范围s.Add strSheetName, = & strSheetName & !$A$1:$ & _ uGetColName(intFieldCount + 1) & $ & lngRecordCount'// 保存Excel 文件exlBook.SaveAs strExcelFile'// 退出Excel 实例exlApplication.QuitExportTempletToExcel = TrueEnd If'adStateOpen = 1If .State = 1 Then.CloseEnd IfEnd WithLocalErr:'*********************************************'** 释放所有对象'*********************************************Set exlSheet = NothingSet exlBook = NothingSet exlApplication = NothingSet adoRt = Nothing'*********************************************If Err.Number <> 0 ThenErr.ClearEnd IfMe.MousePointer = vbDefaultEnd Function'// 取得列名Private Function uGetColName(ByVal intNum As Integer) As StringDim strColNames As StringDim strReturn As String'// 通常字段数不会太多,所以到26*3 目前已经够了。
plc网口vb 通讯PLC网口VB通讯——实现智能化生产控制的利器随着工业自动化的快速发展,PLC(Programmable Logic Controller,可编程逻辑控制器)已经成为现代生产线上不可或缺的设备之一。
而要使PLC实现与计算机的通讯,以实现更高级别的控制和监测功能,则需要借助VB(Visual Basic)编程语言。
本文将介绍PLC网口VB通讯的基本原理以及其在实际应用中发挥的重要作用。
一、PLC网口VB通讯基本原理PLC网口VB通讯主要是通过以太网接口实现的。
PLC通过网口与上位机进行通信,由VB程序控制上位机与PLC之间的数据交换。
具体而言,PLC网口VB通讯需要解决以下几个关键问题:1. 协议选择:PLC通常支持多种通信协议,例如MODBUS、OPC等。
在选择协议时需要根据具体应用场景和PLC型号进行判断,并根据协议规范进行编程。
2. IP地址设置:为了确保上位机与PLC能够互相识别和连接,需要为PLC和上位机分配合适的IP地址,并设置子网掩码和默认网关等网络参数。
3. 数据格式与交换:在PLC网口VB通讯中,数据格式的定义和交换非常关键。
通常情况下,可以利用VB编程实现数据的读取、写入和解析,以实现与PLC之间的数据交互。
二、PLC网口VB通讯的实际应用PLC网口VB通讯在许多领域都得到了广泛的应用,为企业的生产控制和监测提供了可行的解决方案。
下面以几个实际案例进行介绍:1. 智能制造:在智能制造领域,PLC网口VB通讯可以实现生产流程的高度自动化和集成化管理。
通过与上位机的通讯,PLC 可以接收指令进行实时控制,并将生产数据反馈给上位机,以便进行数据分析和优化。
2. 物流仓储:在物流仓储领域,PLC网口VB通讯可以实现仓库的自动化控制和货物追踪。
利用上位机与PLC进行通讯,可以实时监测仓库存货情况,并对货物进行分类、分拣和入库等操作。
3. 能源管理:在能源管理领域,PLC网口VB通讯可以实现对能源设备的监控和控制。
ABPLC通讯设置ABPLC通讯设置Logix 1500 Plc(RS232口)与PC通讯RS232PLCPC(9D插头)3开始—〉〉程序—〉〉Rockwell software —〉〉RSLinx—〉〉RSLinx菜单Communictions—〉〉Configure Drivers 显示如下:创建新设置,“RS-232 DF1 devices”选择“AB_DF1-1”设置串口,及Device,鼠标点击“自动配置”测试成功后界面PLC以太网模块通讯设置下一步RSLinx—〉communictions—〉RSWho,打开PLC编程软件,开始—〉〉程序—〉〉Rockwell software —〉〉RSLinx—〉〉RSLlogix 500 English新建配置PLC的CPU型号双击“IO Configuration”,添加PL其他模块双击“Channel Configuration”检查通讯设置界面1界面2界面3界面4PLC在线测试测试成功画面VB于ABPLC之间的DDE设置判断RSLinx是否运行开始—〉〉程序—〉〉Rockwell software —〉〉RSLinx—〉〉RSLinx打开的界面查看PLC寄存器的值:菜单Communictions—〉〉RSWho 显示如下:鼠标右键点击“01,SLC-5/04,UNTITLED”,再点“Data Monitor”,显示显示PLC内N7寄存器的实时值(事先要定义N7)建立DDE连接:鼠标右键点击“01,SLC-5/04,UNTITLED”,再点“Configure New DDE/OPC”,显示更改DDE默认名称“UNTITLED”为VB程序引用的实际名字。
VB程序设置:<1>先判断“RSLINX.EXE”是否运行On Error GoTo ErrFlagAppActivate "RSLinx"Exit SubErrFlag:Call Shell("C:\Program Files\Rockwell Software\RSLINX\RSLINX.EXE", vbHide)<2>建立DDE连接Label1.LinkTopic ="RSLINX|UNTITLED" ‘DDE名字Label1.LinkItem = "N7:0" ‘N7寄存器Label1.LinkMode = 1 ‘1:Automatic。
vb与plc网口通讯在工业自动化领域,VB和PLC之间的网口通讯是非常重要的一项技术。
VB(Visual Basic)是一种基于Windows操作系统的编程语言,而PLC(Programmable Logic Controller)是一种专门用于控制工业过程的计算机控制系统。
通过实现VB与PLC之间的网口通讯,可以实现双方之间的数据交互,从而实现工业自动化系统的监控和控制。
一、背景介绍随着工业自动化的快速发展,PLC在工业控制领域中的应用越来越广泛。
而VB作为一种高级对象化、事件驱动的编程语言,具有编写人机界面友好的优点。
因此,将VB与PLC进行网口通讯,不仅可以充分发挥PLC的控制能力,还可以利用VB的强大的界面开发能力,实现工业自动化系统的可视化管理。
二、VB与PLC网口通讯的原理VB与PLC之间的网口通讯主要基于TCP/IP协议。
PLC通过提供基于TCP/IP的通信模块,作为服务器等待VB的连接请求。
而VB则作为客户端,向PLC发起连接请求。
一旦连接成功,VB就可以通过TCP/IP协议与PLC进行双向数据交互。
三、VB与PLC网口通讯的步骤1. 确定PLC的IP地址和端口号。
在进行VB与PLC的网口通讯之前,首先需要确定PLC的IP地址和端口号。
通常情况下,这些参数会在PLC的配置软件中进行设置。
2. 使用VB的Socket控件实现通信。
在VB中使用Socket控件,可以方便地实现与PLC的网口通信。
通过设置Socket的IP地址和端口号,VB可以与PLC进行连接,并通过Socket发送和接收数据。
3. 编写VB程序与PLC进行数据交互。
通过Socket控件,VB可以发送指令给PLC,以实现对PLC的控制。
同时,VB还可以从PLC中读取数据,实现对工业自动化过程的监控。
四、VB与PLC网口通讯的应用1. 监控工业过程。
通过VB与PLC的网口通讯,可以实时获取PLC中的数据,并将这些数据可视化地呈现在VB的界面上。
VB与AB的PLC之间通讯2007-05-31 来源:西部工控网浏览:300[推荐朋友] [打印本稿] [字体:大小]VB与AB PLC之间通讯AB系列PLC一般都有专用驱动程序用于实现PLC和计算机之间通讯,如RSLINX就是专门用于做这项工作,但使用RSLINX也具有一定局限性,这里提供一个使用VB编程实现PLC和计算机之间通讯程序,使用协议是DF1,可以支持Micrologix、SLC500等系列PLC。
使用代码如下:Option ExplicitDim tns%, comunicatingPrivate Sub Command1_Click()ReDim tb%(10)Dim stIf ReadTable(0, tb%()) ThenFor st = 0 To 9 '显示结果Text1.SelText = Str(tb%(st)) + Chr(32)Next stText1.SelText = Chr(13) + Chr(10)End IfEnd SubPrivate Sub Command2_Click()ReDim tm%(5)tm%(0) = Rnd * 32768tm%(1) = Rnd * 32768tm%(2) = Rnd * 32768tm%(3) = Rnd * 32768tm%(4) = Rnd * 32768If Not WriteTable(4, tm%()) Then Text1.SelText = "写入错误!!" End SubPrivate Sub Exit_Click()Unload MeEndEnd SubPrivate Sub Form_Load()Comm1.PortOpen = TrueEnd SubPrivate Sub Form_Unload(Cancel As Integer)Comm1.PortOpen = FalseEnd SubPrivate Sub CalcCRC(mes$)Dim byt%, res&'对消息进行crc校验,然后将结果添加到消息结尾。
利用VB6.0 实现PC 与三菱PLC 的通信本文介绍的 PC 与三菱 FX 系列 PLC 通信,是通过 PLC 的编程口与 PC 机的串口进行的,采用编程电缆作为计算机与 PLC 通信的连线。
FX2系列PLC的编程接口采用RS-422标准,而计算机的串行口采用的是RS-232标准,因此作为实现PLC与计算机通信的接口模块FX-232AW,必须将RS-422标准转换成RS-232标准,同时在实现上述过程中采用光电隔离技术。
图1一、串口的相关知识1)串行通信的概念图2所谓“串行通信”是指外设和计算机间使用一根数据信号线(另外需要地线,可能还需要控制线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。
如图2所示。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,当然,其传输速度比并行传输慢2)常见的串口通信规约:目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422,RS485较远),若距离较远,需附加调制解调器(MODEM)。
最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,且直接用RS232相连。
RS-232C: “1”=-3~-15;“0”=+3~+15速率:0~20000bps;一般传输距离:15m。
RS-422:采用平衡传输,平衡发送器、差动接收器,速率:10Mbps/15m;90Kbps/1200m抗干扰能力强。
DB9和DB25的常用信号脚说明由于FX 2-232AW 价格过贵所以我们选用选用MAXIM 公司的MAX202实现RS-232与TTL 之间的电平转换。
MAX202内部有电压倍增电路和转换电路,仅需+5V 电源就可工作,使用十分方便;选用MAX490实现RS-485与TTL 之间的转换。
每片MAX490有一对发送器/接收器,由于通信采用全双工方式,故需两片MAX490,另外只需外接4只电容即可。
VB与AB的PLC之间通讯
VB与AB PLC之间通讯
AB系列PLC一般都有专用驱动程序用于实现PLC和计算机之间通讯,如RSLINX 就是专门用于做这项工作,但使用RSLINX也具有一定局限性,这里提供一个使用VB编程实现PLC和计算机之间通讯程序,使用协议是DF1,可以支持Micrologix、SLC500等系列PLC。
使用代码如下:
Option Explicit
Dim tns%, comunicating
Private Sub Command1_Click()
ReDim tb%(10)
Dim st
If ReadTable(0, tb%()) Then
For st = 0 To 9 '显示结果
Text1.SelText = Str(tb%(st)) + Chr(32)
Next st
Text1.SelText = Chr(13) + Chr(10)
End If
End Sub
Private Sub Command2_Click()
ReDim tm%(5)
tm%(0) = Rnd * 32768
tm%(1) = Rnd * 32768
tm%(2) = Rnd * 32768
tm%(3) = Rnd * 32768
tm%(4) = Rnd * 32768
If Not WriteTable(4, tm%()) Then Text1.SelText = "写入错误!!"
End Sub
Private Sub Exit_Click()
Unload Me
End
End Sub
Private Sub Form_Load()
Comm1.PortOpen = True
End Sub
Private Sub Form_Unload(Cancel As Integer)
Comm1.PortOpen = False
End Sub
Private Sub CalcCRC(mes$)
Dim byt%, res&
'对消息进行crc校验,然后将结果添加到消息结尾。
byt% = 3
Do
res& = res& Xor Asc(Mid(mes$, byt%, 1))
rotate res&
If Asc(Mid(mes$, byt%, 1)) = 16 Then
mes$ = Left$(mes$, byt%) + Chr(16) + Right$(mes$, Len(mes$) - byt%)
byt% = byt% + 1
End If
byt% = byt% + 1
Loop While (byt% <= Len(mes$) - 2)
res& = res& Xor 3
rotate res&
mes$ = mes$ + Chr(res& Mod 256) + Chr(Int(res& / 256))
End Sub
Function ReadTable(start, n%())
Dim st, com$
'从PLC CIF数据表中读取数据, Micrologix=N7 SLC500=N9
If comunicating Then Exit Function
comunicating = True
m1.InputLen = 0 '清缓冲区
com$ = m1.Input
'构建消息
com$ = Chr(16) + Chr(2) + Chr(0) + Chr(0)
com$ = com$ + Chr(1) + Chr(0) + Chr(tns%) + Chr(0)
com$ = com$ + Chr(start) + Chr(0) + Chr(UBound(n%) * 2)
com$ = com$ + Chr(16) + Chr(3)
'进行crc计算并附加到结尾。
CalcCRC com$
tns% = tns% + 1
If tns% = 256 Then tns% = 0
'发送命令
m1.Output = com$
'等待确认
st = Timer
Do
DoEvents
Loop While st + 3 > Timer And m1.InBufferCount < 2 '从缓冲中移除确认
m1.InputLen = 2
com$ = m1.Input
If com$ <> Chr(16) + Chr(6) Then
comunicating = False
Exit Function
End If
st = Timer '等待应答
Do
DoEvents
Loop While st + 3 > Timer And m1.InBufferCount < 12 + (UBound(n%)
* 2)
'超时则退出
If m1.InBufferCount < 12 + (UBound(n%) * 2) Then comunicating = False
Exit Function
End If
'发送确认
m1.Output = Chr(16) + Chr(6)
'到应答
m1.InputLen = 0
com$ = m1.Input
st = 3
Do
If Mid(com$, st, 1) = Chr(16) Then
com$ = Left(com$, st) + Right(com$, Len(com$) - 1 - st)
End If
st = st + 1
Loop While st < Len(com$) - 4
'保存结果
For st = 0 To UBound(n%) - 1
n%(st) = 256 * Asc(Mid(com$, 2 * st + 10, 1)) + Asc(Mid(com$, 2 * st + 9,
1))
Next st
ReadTable = True
comunicating = False
End Function
Private Sub rotate(res&)
Dim bitout%, shift%
For shift% = 1 To 8
bitout% = res& Mod 2
res& = Int(res& / 2)
If bitout% Then
res& = res& Xor &H1000A001
res& = res& - &H10000000
End If
Next shift%
End Sub
Function WriteTable(start, n%())
Dim st, com$
'写到PLC CIF数据表, Micrologix=N7 SLC500=N9
If comunicating Then Exit Function
comunicating = True
m1.InputLen = 0
com$ = m1.Input
com$ = Chr(16) + Chr(2) + Chr(0) + Chr(0)
com$ = com$ + Chr(8) + Chr(0) + Chr(tns%) + Chr(0)
com$ = com$ + Chr(start) + Chr(0)
For st = 0 To UBound(n%)
com$ = com$ + Chr(n%(st) Mod 256) + Chr(Int(n%(st) / 256)) Next st
com$ = com$ + Chr(16) + Chr(3)
tns% = tns% + 1
If tns% = 256 Then tns% = 0
CalcCRC com$
m1.Output = com$
st = Timer
Do
DoEvents
Loop While st + 3 > Timer And m1.InBufferCount < 2 m1.InputLen = 2
com$ = m1.Input
If com$ <> Chr(16) + Chr(6) Then
comunicating = False
Exit Function
End If
st = Timer
Do
DoEvents
Loop While st + 3 > Timer And m1.InBufferCount < 12 m1.Output = Chr(16) + Chr(6)
If m1.InBufferCount < 12 Then
comunicating = False
Exit Function
End If
m1.Output = Chr(16) + Chr(6) WriteTable = True
comunicating = False
End Function。