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