?? pc&plc.frm
字號:
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"
Begin VB.Form PLCForm
Caption = "PC機與PLC串口通信"
ClientHeight = 2985
ClientLeft = 60
ClientTop = 450
ClientWidth = 5655
LinkTopic = "Form1"
ScaleHeight = 2985
ScaleWidth = 5655
StartUpPosition = 3 '窗口缺省
Begin VB.Timer Timer1
Interval = 300
Left = 210
Top = 2415
End
Begin VB.Frame Frame1
Caption = "開關量輸入"
Height = 2040
Left = 105
TabIndex = 6
Top = 105
Width = 2295
Begin VB.ComboBox ListInAddr
Height = 300
Left = 960
TabIndex = 7
Text = "Combo1"
Top = 480
Width = 1125
End
Begin VB.Label Label1
AutoSize = -1 'True
BackStyle = 0 'Transparent
Caption = "地址:"
ForeColor = &H00000000&
Height = 180
Index = 3
Left = 180
TabIndex = 9
Top = 540
Width = 540
End
Begin VB.Shape InAlarm
BackColor = &H00C0FFC0&
BackStyle = 1 'Opaque
FillColor = &H00C0FFC0&
FillStyle = 0 'Solid
Height = 615
Left = 1050
Shape = 3 'Circle
Top = 1050
Width = 855
End
Begin VB.Label Label1
AutoSize = -1 'True
BackStyle = 0 'Transparent
Caption = "狀態:"
ForeColor = &H00000000&
Height = 180
Index = 2
Left = 210
TabIndex = 8
Top = 1260
Width = 540
End
End
Begin MSCommLib.MSComm MSComm1
Left = 4830
Top = 2310
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = -1 'True
End
Begin VB.Frame Frame2
Caption = "開關量輸出"
Height = 2040
Left = 2415
TabIndex = 2
Top = 105
Width = 3135
Begin VB.CommandButton Cmdset
Caption = "置位"
Height = 585
Left = 2205
TabIndex = 11
Top = 315
Width = 720
End
Begin VB.CommandButton Cmdreset
Caption = "復位"
Height = 585
Left = 2205
TabIndex = 10
Top = 1155
Width = 720
End
Begin VB.ComboBox ListOutAddr
Height = 300
Left = 960
TabIndex = 5
Text = "Combo2"
Top = 480
Width = 1125
End
Begin VB.Label Label1
AutoSize = -1 'True
BackStyle = 0 'Transparent
Caption = "狀態:"
ForeColor = &H00000000&
Height = 180
Index = 0
Left = 210
TabIndex = 4
Top = 1260
Width = 540
End
Begin VB.Shape OutAlarm
BackColor = &H00C0FFC0&
BackStyle = 1 'Opaque
FillColor = &H00C0FFC0&
FillStyle = 0 'Solid
Height = 615
Left = 1050
Shape = 3 'Circle
Top = 1050
Width = 855
End
Begin VB.Label Label1
AutoSize = -1 'True
BackStyle = 0 'Transparent
Caption = "地址:"
ForeColor = &H00000000&
Height = 180
Index = 1
Left = 180
TabIndex = 3
Top = 540
Width = 540
End
End
Begin VB.CommandButton Cmdquit
Caption = "退 出"
Height = 375
Left = 3360
TabIndex = 1
Top = 2415
Width = 1245
End
Begin VB.CommandButton Cmdtest
Caption = "回路測試"
Height = 375
Left = 945
TabIndex = 0
Top = 2415
Width = 1245
End
End
Attribute VB_Name = "PLCForm"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'定義變量
Dim setadOut As String, DevDatOut As String
'程序初始化
Private Sub Form_Load()
'列出PLC端口輸入輸出全部地址
For g = 0 To 7
ListInAddr.AddItem g
ListOutAddr.AddItem g
Next g
For h = 10 To 17
ListInAddr.AddItem h
ListOutAddr.AddItem h
Next h
ListInAddr.ListIndex = 0
ListOutAddr.ListIndex = 0
MSComm1.CommPort = 1 '通信口
MSComm1.Settings = "9600,E,7,1" '串口參數設置
MSComm1.Handshaking = 0 '握手信號
MSComm1.InputLen = 0 '設置和返回input每次讀出的字節數,設為0時讀出接收緩沖區中的內容
MSComm1.OutBufferCount = 0 '設置和返回發送緩沖區的字節數,設為0時清空發送緩沖區
MSComm1.InBufferCount = 0 '設置和返回接收緩沖區的字節數,設為0時清空接收緩沖區
MSComm1.PortOpen = True '打開串口
InAlarm.FillColor = QBColor(10) '輸入信號指示燈,初始綠色
OutAlarm.FillColor = QBColor(10) '輸出信號指示燈,初始綠色
End Sub
'回路測試
Private Sub cmdtest_Click()
Dim Tim As Single
MSComm1.InBufferCount = 0 '清空接收緩沖區
MSComm1.OutBufferCount = 0 '清空發送緩沖區
MSComm1.Output = Chr(5)
Tim = Timer '返回一個 Single,代表從午夜開始到現在經過的秒數
Do
If Timer > Tim + 1 Then MsgBox "與PLC沒有連接!": Exit Sub
Loop Until MSComm1.InBufferCount = 1
If Left$(MSComm1.Input, 1) = Chr(6) Then
MsgBox "與PLC通訊正常!", , "與PLC通訊檢測"
Else
MsgBox "與PLC通訊不正常!", 48, "與PLC通訊檢測"
End If
End Sub
'置位:置指定地址端口為ON,即打開指示燈
Private Sub Cmdset_Click()
Call diziq
If CStr(Val(setadOut)) <> setadOut Then Exit Sub '數字區包括了字母
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
DevDatOut = "7" + DevDatOut
FG:
MSComm1.Output = Chr(2) + DevDatOut + SumChk(DevDatOut)
Tim = Timer
Do
If Timer > Tim + 1 Then: Exit Do
Loop Until MSComm1.InBufferCount = 1
If MSComm1.Input = Chr(6) Then
MSComm1.InBufferCount = 0
Else
If MsgBox("置位不成功", vbRetryCancel + vbCritical) = vbCancel Then Exit Sub
If MsgBox("置位不成功", vbRetryCancel + vbCritical) = vbRetry Then GoTo FG
End If
OutAlarm.FillColor = QBColor(12)
End Sub
'復位:置指定地址端口為OFF,即關閉指示燈
Private Sub Cmdreset_Click()
Call diziq
If CStr(Val(setadOut)) <> setadOut Then Exit Sub '數字區包括了字母
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
DevDatOut = "8" + DevDatOut
FG:
MSComm1.Output = Chr(2) + DevDatOut + SumChk(DevDatOut)
Tim = Timer
Do
If Timer > Tim + 1 Then: Exit Do
Loop Until MSComm1.InBufferCount = 1
If MSComm1.Input = Chr(6) Then
MSComm1.InBufferCount = 0
Else
If MsgBox("復位不成功", vbRetryCancel + vbCritical) = vbCancel Then Exit Sub
If MsgBox("復位不成功", vbRetryCancel + vbCritical) = vbRetry Then GoTo FG
End If
OutAlarm.FillColor = QBColor(10)
End Sub
'周期檢測輸出端口狀態
Private Sub Timer1_Timer()
Call In_for
End Sub
Private Sub In_for()
Dim awe, awe1, weishu
Dim BN8, BN7, BN6, BN5, BN4, BN3, BN2, BN1 As Integer
Dim devadd As String, setin As String, setad As String
Dim weishu1 As String, setad1 As String
setad = ListInAddr
If CStr(Val(setad)) <> setad Then Exit Sub '數字區包括了字母
If (setad Mod 10) < 4 Then '斷定是低四位還是高四位
weishu = 0
Else
weishu = 1
End If
awe1 = setad Mod 10
If Oct(Val("&o" + setad)) <> setad Then '判斷是不是八進制。
Exit Sub
End If
setad1 = Val(Str(setad \ 10))
devadd = "0" + "008" + Hex("&o" + setad1) + "02" + Chr(3)
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
MSComm1.Output = Chr(2) + devadd + SumChk(devadd)
Tim = Timer
Do
If Timer > Tim + 1 Then: Exit Do
Loop Until MSComm1.InBufferCount = 20
setin = MSComm1.Input
weishu1 = Val("&H" + Mid(setin, 2, 2))
awe = dec2bin(weishu1)
BN8 = Mid(awe, 1, 1)
BN7 = Mid(awe, 2, 1)
BN6 = Mid(awe, 3, 1)
BN5 = Mid(awe, 4, 1)
BN4 = Mid(awe, 5, 1)
BN3 = Mid(awe, 6, 1)
BN2 = Mid(awe, 7, 1)
BN1 = Mid(awe, 8, 1)
Select Case awe1
Case 0 'awe1斷定元件號的位數,如是0位或4位
If BN1 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 1
If BN2 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 2
If BN3 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 3
If BN4 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 4 'awe1斷定元件號的位數,如是0位或4位
If BN5 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 5
If BN6 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 6
If BN7 = 1 Then
biaozi = True
Else
biaozi = False
End If
Case 7
If BN8 = 1 Then
biaozi = True
Else
biaozi = False
End If
End Select
If biaozi = True Then
InAlarm.FillColor = QBColor(12)
Else
InAlarm.FillColor = QBColor(10)
End If
End Sub
'轉換成二進制
Private Function dec2bin(Dats$) As String
Dim bin8, bin4, bin2, bin1, bin16, bin32, bin64, bin128
If Dats \ 128 >= 1 Then
bin128 = 1
Else
bin128 = 0
End If
If (Dats Mod 128) \ 64 >= 1 Then
bin64 = 1
Else
bin64 = 0
End If
If (Dats Mod 64) \ 32 >= 1 Then 'Mod用來對兩個數作除法并且只返回余數
bin32 = 1
Else
bin32 = 0
End If
If (Dats Mod 32) \ 16 >= 1 Then
bin16 = 1
Else
bin16 = 0
End If
If (Dats Mod 16) \ 8 >= 1 Then '\ 運算符用來對兩個數作除法并返回一個整數
bin8 = 1
Else
bin8 = 0
End If
If (Dats Mod 8) \ 4 >= 1 Then 'Mod用來對兩個數作除法并且只返回余數
bin4 = 1
Else
bin4 = 0
End If
If (Dats Mod 4) \ 2 >= 1 Then
bin2 = 1
Else
bin2 = 0
End If
If Dats Mod 2 = 0 Then
bin1 = 0
Else
bin1 = 1
End If
bin128 = CStr(bin128) 'CStr 函數將一數值轉換為 String
bin64 = CStr(bin64)
bin32 = CStr(bin32)
bin16 = CStr(bin16)
bin8 = CStr(bin8) 'CStr 函數將一數值轉換為 String
bin4 = CStr(bin4)
bin2 = CStr(bin2)
bin1 = CStr(bin1)
dec2bin = bin128 + bin64 + bin32 + bin16 + bin8 + bin4 + bin2 + bin1
End Function
'地址計算
Public Sub diziq()
Dim setaddr As String
setadOut = ListInAddr.Text
If setadOut = "" Then
MsgBox ("請輸入元件地址!")
Exit Sub
End If
If CStr(Val(setadOut)) <> setadOut Then Exit Sub '數字區包括了字母
If Oct(Val("&o" + setadOut)) <> setadOut Then '判斷是不是八進制。
Exit Sub
End If
DevDatOut = ydizi(setadOut)
End Sub
'地址范圍是0500__057F,方式是1032
Private Function ydizi(Dats$) As String
Dim devadd As String
Dim station1
devadd = Hex("&o" + setadOut)
station1 = "00" + devadd
devadd = Right(station1, 2)
ydizi = devadd + "05" + Chr(3) 'Y的地址
End Function
Private Function SumChk(Dats$) As String
Dim I&
Dim CHK&
For I = 1 To Len(Dats)
CHK = CHK + Asc(Mid(Dats, I, 1))
Next I
SumChk = Right(Hex$(CHK), 2)
End Function
'關閉串口退出程序
Private Sub cmdquit_Click()
Set PLCForm = Nothing
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
End
End Sub
Private Sub Form_Unload(Cancel As Integer)
Set PLCForm = Nothing
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
End
End Sub
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -