📄 bas_s7_ppi.bas
字号:
Attribute VB_Name = "S7_PPI"
Option Explicit
'******************************************************************
'功能:读取西门子PPI协议
'编程:麻树波
'Email:msb.sf@163.com
'QQ:105714583
'******************************************************************
Private Declare Sub Sleep Lib "kernel32" (ByVal dwseconds As Long)
Public Function Comm_OK(comDEv As Object)
Dim str_val(0 To 5) As Byte
Sleep (100)
str_val(0) = &H10
str_val(1) = &H2
str_val(2) = &H0
str_val(3) = &H5C
str_val(4) = &H5E
str_val(5) = &H16
comDEv.Output = str_val
End Function
Public Function s7200_VW_WRITE(comDEv As Object, VwStart As Integer, Vwcount As Integer, VW_v() As Long)
Dim Temp_FCS As Variant
Dim i As Long
Dim AllDatanum As Long
If Vwcount > 111 Then '数量限制
MsgBox "输入数量大于最大允许值(111pcs)...", vbOKOnly + vbCritical, "PPI communication error..."
Exit Function
End If
'S(1)=S(2)=hex(Vw数×2+31) 数据块数量 自 S(4)-S(end)
'S(24)=vw数*2 数据字节数
'S(16)=s(24)6+4
'S(33)=(S(24)*8)\256
'S(34)=(S(24)*8) mod 256
'数组数目=S(1)+4
AllDatanum = Vwcount * 2 + 36
ReDim str_write(AllDatanum) As Byte
str_write(1) = Vwcount * 2 + 31
str_write(2) = str_write(1)
str_write(24) = Vwcount * 2
str_write(16) = str_write(24) + 4
str_write(33) = (Vwcount * 16) \ 256
str_write(34) = (Vwcount * 16) Mod 256
str_write(29) = (VwStart * 8) \ 256 '地址
str_write(30) = (VwStart * 8) Mod 256 '地址
str_write(0) = &H68
str_write(3) = &H68
str_write(4) = &H2
str_write(5) = &H0
str_write(6) = &H7C
str_write(7) = &H32
str_write(8) = &H1
str_write(9) = &H0
str_write(10) = &H0
str_write(11) = &H43
str_write(12) = &H1
str_write(13) = &H0
str_write(14) = &HE
str_write(15) = &H0
str_write(17) = &H5
str_write(18) = &H1
str_write(19) = &H12
str_write(20) = &HA
str_write(21) = &H10
str_write(22) = &H2
str_write(23) = &H0
str_write(25) = &H0
str_write(26) = &H1
str_write(27) = &H84
str_write(28) = &H0
str_write(31) = &H0
str_write(32) = &H4
For i = 35 To AllDatanum - 2 Step 2 '分隔数据
str_write(i) = VW_v((i - 35) / 2) \ 256
str_write(i + 1) = VW_v((i - 35) / 2) Mod 256
Next
For i = 4 To AllDatanum - 2 '计算数据和
Temp_FCS = Temp_FCS + str_write(i)
Next
str_write(AllDatanum - 1) = Temp_FCS Mod 256 '计算检验码
str_write(AllDatanum) = &H16
comDEv.Output = str_write
Comm_OK comDEv
End Function
Public Function s7200_M_set(comDEv As Object, Mx As Byte, My As Byte, Mv As Byte)
Dim str_write(0 To 37) As Byte
Dim Temp_FCS As Variant
Dim i As Long
If Mx > 31 Or My > 7 Then '数量限制
MsgBox "输入M寄存器地址不合法...", vbOKOnly + vbCritical, "PPI communication error..."
Exit Function
End If
If Mv > 1 Then '数量限制
MsgBox "输入M寄存器数值不合法(0o r 1)...", vbOKOnly + vbCritical, "PPI communication error..."
Exit Function
End If
'S(30)=Mx*8+My
'S(35)=Mv 数值
str_write(0) = &H68
str_write(1) = &H20
str_write(2) = &H20
str_write(3) = &H68
str_write(4) = &H2
str_write(5) = &H0
str_write(6) = &H7C
str_write(7) = &H32
str_write(8) = &H1
str_write(9) = &H0
str_write(10) = &H0
str_write(11) = &H43
str_write(12) = &H1
str_write(13) = &H0
str_write(14) = &HE
str_write(15) = &H0
str_write(16) = &H5
str_write(17) = &H5
str_write(18) = &H1
str_write(19) = &H12
str_write(20) = &HA
str_write(21) = &H10
str_write(22) = &H1
str_write(23) = &H0
str_write(24) = &H1
str_write(25) = &H0
str_write(26) = &H0
str_write(27) = &H83
str_write(28) = &H0
str_write(29) = &H0
str_write(30) = Mx * 8 + My
str_write(31) = &H0
str_write(32) = &H3
str_write(33) = &H0
str_write(34) = &H1
str_write(35) = Mv
For i = 4 To 35 '计算数据和
Temp_FCS = Temp_FCS + str_write(i)
Next
str_write(36) = Temp_FCS Mod 256 '计算检验码
str_write(37) = &H16
comDEv.Output = str_write
Comm_OK comDEv
End Function
Public Function s7200_M_writebyte(comDEv As Object, Mx As Byte, Mv As Byte)
Dim str_write(0 To 37) As Byte
Dim Temp_FCS As Variant
Dim i As Long
If Mx > 31 Then '数量限制
MsgBox "输入M寄存器地址不合法(M<=31)...", vbOKOnly + vbCritical, "PPI communication error..."
Exit Function
End If
If Mv > 255 Then
MsgBox "输入M寄存器数值超过最大值(255)...", vbOKOnly + vbCritical, "PPI communication error..."
Exit Function
End If
'S(30)=Mx*8+My
'S(35)=Mv 数值
str_write(0) = &H68
str_write(1) = &H20
str_write(2) = &H20
str_write(3) = &H68
str_write(4) = &H2
str_write(5) = &H0
str_write(6) = &H7C
str_write(7) = &H32
str_write(8) = &H1
str_write(9) = &H0
str_write(10) = &H0
str_write(11) = &H43
str_write(12) = &H1
str_write(13) = &H0
str_write(14) = &HE
str_write(15) = &H0
str_write(16) = &H5
str_write(17) = &H5
str_write(18) = &H1
str_write(19) = &H12
str_write(20) = &HA
str_write(21) = &H10
str_write(22) = &H2
str_write(23) = &H0
str_write(24) = &H1
str_write(25) = &H0
str_write(26) = &H0
str_write(27) = &H83
str_write(28) = &H0
str_write(29) = &H0
str_write(30) = Mx * 8
str_write(31) = &H0
str_write(32) = &H4
str_write(33) = &H0
str_write(34) = &H8
str_write(35) = Mv
For i = 4 To 35 '计算数据和
Temp_FCS = Temp_FCS + str_write(i)
Next
str_write(36) = Temp_FCS Mod 256 '计算检验码
str_write(37) = &H16
comDEv.Output = str_write
Comm_OK comDEv
End Function
Public Function S7200_Vw_read(comDEv As Object, VwStart As Integer, Vwcount As Integer)
If Vwcount > 111 Then '数量限制
MsgBox "输入数量大于最大允许值(111pcs)...", vbOKOnly + vbCritical, "PPI communication error..."
Exit Function
End If
Dim str_read(0 To 32) As Byte
Dim i As Integer
Dim Temp_FCS As Variant
str_read(0) = &H68
str_read(1) = &H1B
str_read(2) = &H1B
str_read(3) = &H68
str_read(4) = &H2
str_read(5) = &H0
str_read(6) = &H6C
str_read(7) = &H32
str_read(8) = &H1
str_read(9) = &H0
str_read(10) = &H0
str_read(11) = &H0
str_read(12) = &H0
str_read(13) = &H0
str_read(14) = &HE
str_read(15) = &H0
str_read(16) = &H0
str_read(17) = &H4
str_read(18) = &H1
str_read(19) = &H12
str_read(20) = &HA
str_read(21) = &H10
str_read(22) = &H4
str_read(23) = &H0
str_read(24) = Vwcount
str_read(25) = &H0
str_read(26) = &H1
str_read(27) = &H84
str_read(28) = &H0
str_read(29) = (VwStart * 8) \ 256
str_read(30) = (VwStart * 8) Mod 256
For i = 4 To 30
Temp_FCS = Temp_FCS + str_read(i)
Next i
str_read(31) = Temp_FCS Mod 256
str_read(32) = &H16
comDEv.Output = str_read
Comm_OK comDEv
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -