各位好,现在正在做一程序,vb和西门子plc,s7-300通讯的项目(十六进制)。单独做上位机接受数据时可以正常接收到plc发过来的十六进制信息 ,但是然后续上上位机发送数据代码就不能通讯成功,不知道发送数据应该如何写。协议是:上位机接受40字节。发送25字节。第一位起始位255。中间的数据就忽略不写了。发送和接受时交叉进行的。哪位能给具体提示一下逻辑上需要如何改正啊,现在就感觉不对,但是不知道该修改哪里。谢谢!
具体代码如下
Private Sub MSComPLC_OnComm()
Dim buffer As Variant
Dim InString(0 To PLCRxCount - 1) As Byte
Dim i As Integer
Dim SupplyNum As Integer
Dim CheckInt As Integer
Dim CheckByte As Byte
Dim errTemp As Integer
Select Case MSComPLC.CommEvent
'==================================================================
' 接收数据
'==================================================================
Case comEvReceive
MSComPLC.InputLen = 0
buffer = MSComPLC.Input
For i = 0 To PLCRxCount - 1
InString(i) = buffer(i)
Next i
'==================================================================
' 检查数据完整性/ 计算校验和
'==================================================================
CheckInt = 0
For i = 0 To PLCRxCount - 2
CheckInt = CheckInt + InString(i)
Next i
CheckByte = CheckInt Mod 256
'==================================================================
' 更新上纸台信息,并设置Refresh标志以便更新显示
'==================================================================
If (InString(0) = 255) And (CheckByte = InString(PLCRxCount - 1)) Then
'上纸台可以接受命令
...
...
...(中间程序,可以忽略与本问题无关) End If
End Select
End Sub Private Sub TmPLC_Timer()
Dim OutString(0 To PLCTxCount - 1) As Byte
Dim CheckInt As Integer
Dim j As Integer
Dim i As Integer
Dim AndBit As Integer
' 特征字节
OutString(0) = 255
...
...
...(z中间字节,可以忽略,与本问题无关)
' 校验字节,由计算确定
CheckInt = 0
For j = 0 To PLCTxCount - 2
CheckInt = CheckInt + OutString(j)
Next j
OutString(PLCTxCount - 1) = CheckInt Mod 256
Next i
'==========================================================================
' 发送通讯字节内容
'==========================================================================
MSComPLC.InBufferCount = 0
MSComPLC.Output = OutString
End Sub
具体代码如下
Private Sub MSComPLC_OnComm()
Dim buffer As Variant
Dim InString(0 To PLCRxCount - 1) As Byte
Dim i As Integer
Dim SupplyNum As Integer
Dim CheckInt As Integer
Dim CheckByte As Byte
Dim errTemp As Integer
Select Case MSComPLC.CommEvent
'==================================================================
' 接收数据
'==================================================================
Case comEvReceive
MSComPLC.InputLen = 0
buffer = MSComPLC.Input
For i = 0 To PLCRxCount - 1
InString(i) = buffer(i)
Next i
'==================================================================
' 检查数据完整性/ 计算校验和
'==================================================================
CheckInt = 0
For i = 0 To PLCRxCount - 2
CheckInt = CheckInt + InString(i)
Next i
CheckByte = CheckInt Mod 256
'==================================================================
' 更新上纸台信息,并设置Refresh标志以便更新显示
'==================================================================
If (InString(0) = 255) And (CheckByte = InString(PLCRxCount - 1)) Then
'上纸台可以接受命令
...
...
...(中间程序,可以忽略与本问题无关) End If
End Select
End Sub Private Sub TmPLC_Timer()
Dim OutString(0 To PLCTxCount - 1) As Byte
Dim CheckInt As Integer
Dim j As Integer
Dim i As Integer
Dim AndBit As Integer
' 特征字节
OutString(0) = 255
...
...
...(z中间字节,可以忽略,与本问题无关)
' 校验字节,由计算确定
CheckInt = 0
For j = 0 To PLCTxCount - 2
CheckInt = CheckInt + OutString(j)
Next j
OutString(PLCTxCount - 1) = CheckInt Mod 256
Next i
'==========================================================================
' 发送通讯字节内容
'==========================================================================
MSComPLC.InBufferCount = 0
MSComPLC.Output = OutString
End Sub
解决方案 »
- vsflexgrid指定单元格用红色标记
- vb查询sql数据库 数据类型的一个问题
- DataCombo 在我选择完后,按"确定"时,我希望DataCombo 的值为 空 ,用 DataCombo.Index=-1 会出错。要怎么写?
- 草 这句简单的代码 我竟然查不到啥意思。无奈来这儿求助了。
- 怎么用VB程序把.MDB中的表aa复制到表bb,
- 如何合列标头内容居中
- ▄▅▆▇█ 学VB的,你们该怎么办呀 █▇▆▅▄
- 关于字符串的问题,请大家帮帮忙 没有分了
- 请问如何在VB中启动水晶报表的设计器?高分!
- 有关资源的组织问题
- vb滚动条如何显示进度
- 每天都有几个学科的表要存储,该数据库的存储结构该如何设计呢
Dim PLCRxCount As LongPrivate Sub Form_Load()
TmPLC.Interval = 0
PLCRxCount = 40
MSComPLC.Settings = "9600,n,8,1"
MSComPLC.InputMode = comInputModeBinary
MSComPLC.RThreshold = PLCRxCount
MSComPLC.PortOpen = True
End SubPrivate Sub MSComPLC_OnComm()
Dim buffer As Variant
Dim InString(0 To 40 - 1) As Byte
Dim i As Integer
Dim SupplyNum As Integer
Dim CheckInt As Integer
Dim CheckByte As Byte
Dim errTemp As Integer
Select Case MSComPLC.CommEvent
' 接收数据
Case comEvReceive
MSComPLC.InputLen = 0
buffer = MSComPLC.Input
Label1 = UBound(buffer)
For i = 0 To PLCRxCount - 1
InString(i) = buffer(i)
Next i
' 检查数据完整性/ 计算校验和
CheckInt = 0
For i = 0 To PLCRxCount - 2
CheckInt = CheckInt + InString(i)
Next i
CheckByte = CheckInt Mod 256
Call TmPLC_Timer
' 更新上纸台信息,并设置Refresh标志以便更新显示
'==================================================================
If (InString(0) = 255) And (CheckByte = InString(PLCRxCount - 1)) Then
'上纸台可以接受命令
' ...(中间程序,可以忽略与本问题无关)
End If
End Select
End SubPrivate Sub TmPLC_Timer()
Dim OutString(0 To 25 - 1) As Byte
Dim CheckInt As Integer
Dim j As Integer
Dim i As Integer
Dim AndBit As Integer
' 特征字节
OutString(0) = 255
'...
'...
'...(z中间字节,可以忽略,与本问题无关)
' 校验字节,由计算确定
CheckInt = 0
For j = 0 To PLCTxCount - 2
CheckInt = CheckInt + OutString(j)
Next j
'缺少For 条件
'OutString(PLCTxCount - 1) = CheckInt Mod 256
'Next i
'==========================================================================
' 发送通讯字节内容
'==========================================================================
MSComPLC.InBufferCount = 0
MSComPLC.Output = OutString
End Sub
Private Sub MSComPLC_OnComm()
Dim buffer As Variant
Dim InString(0 To 40 - 1) As Byte
Dim i As Integer
Dim SupplyNum As Integer
Dim CheckInt As Integer
Dim CheckByte As Byte
Dim errTemp As Integer
Select Case MSComPLC.CommEvent
' 接收数据
Case comEvReceive
MSComPLC.InputLen = 0
buffer = MSComPLC.Input
Label1 = UBound(buffer)
For i = 0 To PLCRxCount - 1
InString(i) = buffer(i)
Next i
' 检查数据完整性/ 计算校验和
CheckInt = 0
For i = 0 To PLCRxCount - 2
CheckInt = CheckInt + InString(i)
Next i
CheckByte = CheckInt Mod 256
' 更新上纸台信息,并设置Refresh标志以便更新显示
'==================================================================
If (InString(0) = 255) And (CheckByte = InString(PLCRxCount - 1)) Then
'上纸台可以接受命令
' ...(中间程序,可以忽略与本问题无关)
Call TmPLC_Timer
End If
End Select
End Sub