趙云龍
級別: 正式會員
|
Option Explicit Private Sub Form_Load() '設置本地任意可用端口,這樣系統會自動分配一個未被占用的端口 Winsock1.LocalPort = 0 Winsock2.LocalPort = 0 '設置通信協議為 TCP 協議 Winsock1.Protocol = sckTCPProtocol Winsock2.Protocol = sckTCPProtocol '開始監聽,等待客戶端連接 Winsock1.Listen Winsock2.Listen '初始化PLC地址,IP,端口數據 Open App.Path & "\data\add.ini" For Binary As #1 Add = StrConv(InputB$(LOF(1), 1), vbUnicode) Close #1 Open App.Path & "\data\ip.ini" For Binary As #1 ip = StrConv(InputB$(LOF(1), 1), vbUnicode) Close #1 Open App.Path & "\data\port.ini" For Binary As #1 port = StrConv(InputB$(LOF(1), 1), vbUnicode) Close #1 reg.Text = "0" high.Text = "0" low.Text = "0" End Sub Private Sub SendData_Click() '如果 Winsock 處于已連接狀態 If Winsock1.State = sckConnected Then '構造 Modbus TCP 請求數據 Dim PLC_Add As Long Dim dataToSend As Integer Dim dataToSend1 As Integer Dim dataToSend2 As Integer 'Add PLC起始地址,reg:寄存器地址,high/low高低字節位(數據)。 PLC_Add = Val(Add.Text) To_reg = Val(reg.Text) To_high = Val(high.Text) To_low = Val(low.Text) 'MODBUSTCP報文 Dim request As String request = Chr(&H0) & Chr(&H1) & Chr(&H0) & Chr(&H0) & Chr(&H0) & Chr(&H6) & Chr(&H1) & Chr(&H6) & Chr(PLC_Add - 40001) & Chr(To_reg) & Chr(To_high) & Chr(To_low) '發送構造好的請求數據給 PLC Winsock1.SendData request Exit Sub Else '如果未連接到 PLC,彈出消息提示 MsgBox "Not connected to PLC." End If End Sub Private Sub Timer1_Timer() '定時器事件,用于周期性檢查連接狀態并更新界面 If Winsock1.State = sckConnected Then '如果連接成功,將標簽的背景色設置為綠色(十六進制顏色值 &HC000&) connection.BackColor = &HC000& Else '如果未連接,將標簽的背景色設置為紅色(十六進制顏色值 &HFF&) connection.BackColor = &HFF& End If End Sub Private Sub Timer2_Timer() '定時器事件,用于周期性檢查連接狀態并重新連接 If connection.BackColor = &HFF& Then '檢查 Winsock 的狀態,如果不是已關閉狀態 If Winsock1.State <> sckClosed Then '關閉當前連接,以便重新連接到 PLC Winsock1.Close '確認連接IP地址及端口 Timer3.Interval = 1 End If If Winsock2.State <> sckClosed Then '關閉當前連接,以便重新連接到 PLC Winsock2.Close '確認連接IP地址及端口 Timer3.Interval = 1 End If '變量 Dim plc_ip As String Dim plc_port As Integer '讀取IP及端口參數 plc_ip = ip.Text plc_port = port.Text '連接到指定的 PLC IP 地址和端口號,這里需替換為實際的 PLC IP 和端口 Winsock1.Connect plc_ip, plc_port Winsock2.Connect plc_ip, plc_port '停止IP地址及端口確認 Timer3.Interval = 0 End If End Sub Private Sub Command1_Click() '打開通訊設置窗口 Form2.Show End Sub Private Sub ConnectToPLC_Click() '判斷通訊是否啟動連接 If Timer2.Interval = 0 Then '開始連接 Timer2.Interval = 1 ElseIf Timer2.Interval = 1 Then '判斷通訊是否啟動連接 If Winsock1.State <> sckClosed Then '停止連接 Timer2.Interval = 0 '斷開連接 Winsock1.Close Winsock2.Close End If End If End Sub Private Sub Timer3_Timer() '讀取起始地址 Open App.Path & "\data\add.ini" For Binary As #1 '更新起始地址 Add = StrConv(InputB$(LOF(1), 1), vbUnicode) Close #1 '讀取IP地址 Open App.Path & "\data\ip.ini" For Binary As #1 '更新IP地址 ip = StrConv(InputB$(LOF(1), 1), vbUnicode) Close #1 '讀取端口 Open App.Path & "\data\port.ini" For Binary As #1 '更新端口 port = StrConv(InputB$(LOF(1), 1), vbUnicode) Close #1 '停止更新 Timer3.Interval = 0 End Sub Private Sub TCP0_Click(Index As Integer) '對齊寄存器地址 If reg.Text <> 0 Then reg.Text = 0 End If '開關量轉換 If reg.Text = 0 Then If low.Text = 0 Then low.Text = 1 SendData_Click ElseIf low.Text = 1 Then low.Text = 0 SendData_Click End If End If End Sub Private Sub TCP1_Click(Index As Integer) '對齊寄存器地址 If reg.Text <> 1 Then reg.Text = 1 End If '開關量轉換 If reg.Text = 1 Then If low.Text = 0 Then low.Text = 1 SendData_Click ElseIf low.Text = 1 Then low.Text = 0 SendData_Click End If End If End Sub Private Sub TCP2_Click(Index As Integer) '對齊寄存器地址 If reg.Text <> 2 Then reg.Text = 2 End If '開關量轉換 If reg.Text = 2 Then If low.Text = 0 Then low.Text = 1 SendData_Click ElseIf low.Text = 1 Then low.Text = 0 SendData_Click End If End If End Sub Private Sub TCP3_Click(Index As Integer) '對齊寄存器地址 If reg.Text <> 3 Then reg.Text = 3 End If '開關量轉換 If reg.Text = 3 Then If low.Text = 0 Then low.Text = 1 SendData_Click ElseIf low.Text = 1 Then low.Text = 0 SendData_Click End If End If End Sub Private Sub TCP4_Click(Index As Integer) '對齊寄存器地址 If reg.Text <> 4 Then reg.Text = 4 End If '開關量轉換 If reg.Text = 4 Then If low.Text = 0 Then low.Text = 1 SendData_Click ElseIf low.Text = 1 Then low.Text = 0 SendData_Click End If End If End Sub Private Sub TCP5_Click(Index As Integer) '對齊寄存器地址 If reg.Text <> 5 Then reg.Text = 5 End If '開關量轉換 If reg.Text = 5 Then If low.Text = 0 Then low.Text = 1 SendData_Click ElseIf low.Text = 1 Then low.Text = 0 SendData_Click End If End If End Sub Private Sub end_Click() End End Sub |
---|---|
|