1200与VB通过TCP进行通讯?

已锁定

apkk

  • 帖子

    2
  • 精华

    0
  • 被关注

    1

论坛等级:新手

注册时间:2011-06-22

普通 普通 如何晋级?

1200与VB通过TCP进行通讯?

4850

5

2011-08-10 16:04:17

请问:如何通过TCP获取1200的I0.0、I0.1、I0.2、I0.3这几个输入口的通断状态?

下面有一段VB的代码,通过TCP协议可以控制1200的Q输出口的通断,和获取时钟脉冲。
代码如下:
'下面代码是通过socket发送数据包到plc,可以控制plc的Q口通断
[COLOR=GREEN]
Private Sub Send_to_PLC_Click()
Dim sendstr(269) As Byte '数组下标从0开始,发送270字节,与PLC侧设定的接收DB数据块相对应
Dim S_Real_temp As Single '存储实数
Dim dbx As Single
Dim S_R_temp(3) As Byte
Dim QB_temp As Integer '临时变量
If Winsock1.State = 7 Then
'发送字符 第0字节
sendstr(0) = Asc(S_No.Text)
'发送字节 第1字节
sendstr(1) = CByte(S_Byte.Text)
'发送整型 第2-3字节
sendstr(2) = CByte(S_Int \ 256) '计算高字节
sendstr(3) = CByte(S_Int Mod 256) '计算低字节
'发送双整型 第4-7字节
sendstr(4) = CByte(S_Dint \ 16777216) '计算最高字节
sendstr(5) = CByte((S_Dint Mod 16777216) \ 65536) '计算次高字节
sendstr(6) = CByte(((S_Dint Mod 16777216) Mod 65536) \ 256) '计算次低字节
sendstr(7) = CByte((((S_Dint Mod 16777216) Mod 65536) Mod 256)) '计算最低字节
'发送实数 每8-11字节
S_Real_temp = S_Real.Text
CopyMemory S_R_temp(0), ByVal VarPtr(S_Real_temp), Len((S_Real_temp)) '将32位实数转换成四个字节
sendstr(8) = S_R_temp(3)
sendstr(9) = S_R_temp(2)
sendstr(10) = S_R_temp(1)
sendstr(11) = S_R_temp(0)
' CopyMemory dbx, sendstr(8), 4
' Text1.Text = dbx
' 发送字符串 12 - 267
' 字符串,因为PLC中DB块存储字符串时,第一个字节为最大长度,第二个字节为实际长度,后面的才是字符串联
sendstr(12) = 254
sendstr(13) = CByte(Len(S_Str))
For i = 14 To 13 + Len(S_Str)
sendstr(i) = Asc(Mid(S_Str, i - 13))
Next i
' 补充空格,不是必须的
For i = 14 + Len(S_Str) To 267
sendstr(i) = Asc(" ")
Next i
'
' 位信号,经过PLC输出控制QB0
QB_temp = 0
If Q00.Value = 1 Then
QB_temp = QB_temp + 1
End If
If Q01.Value = 1 Then
QB_temp = QB_temp + 2
End If
If Q02.Value = 1 Then
QB_temp = QB_temp + 4
End If
If Q03.Value = 1 Then
QB_temp = QB_temp + 8
End If
If Q04.Value = 1 Then
QB_temp = QB_temp + 16
End If
If Q05.Value = 1 Then
QB_temp = QB_temp + 32
End If
If Q06.Value = 1 Then
QB_temp = QB_temp + 64
End If
If Q07.Value = 1 Then
QB_temp = QB_temp + 128
End If
sendstr(268) = CByte(QB_temp)
'================================================================
Winsock1.SendData sendstr '发送数据
Else
MsgBox ("网络连接未建立")
End If
End Sub
'====================================
'====================================
下面代码是socket接收plc发过来的数据

Private Sub Winsock1_DataArrival(ByVal bytesTotal As Long)
On Error GoTo ErrProc
Dim strData As String
Dim rcvstr() As Byte '用于存储接收到的数据
Dim Hex_str(3) As Byte
Dim dblval As Single '用于存储转换后的实数
ReDim rcvstr(Winsock1.BytesReceived)
rcvlen = Winsock1.BytesReceived
Winsock1.GetData rcvstr(), vbByte '读取数据,存入rcvstr数组中
' Winsock1.GetData strData, vbString
'发送端数据格式为
'在PLC发送数据块中的起始地址(字节)/数据类型
'0/Char
'1/Byte
'2/Int
'4/Dint
'8/Real
'12/String(256字节)
'268/byte(来自CPU的脉冲时钟)
'269/byte(temp)
'
'
'字符
R_No.Text = Chr(rcvstr(0))
'字节
R_byte.Text = rcvstr(1)
'整型
R_int.Text = Val("&H" & Hex$(rcvstr(2)) & Hex$(rcvstr(3)))
'双整型
R_Dint.Text = Val("&H" & Hex$(rcvstr(4)) & Hex$(rcvstr(5)) & Hex$(rcvstr(6)) & Hex$(rcvstr(7)))
'实数
Hex_str(0) = (rcvstr(11))
Hex_str(1) = (rcvstr(10))
Hex_str(2) = (rcvstr(9))
Hex_str(3) = (rcvstr(8))
CopyMemory dblval, Hex_str(0), 4 '将四个字节计算成实数
R_Real.Text = dblval
'字符串,因为PLC中DB块存储字符串时,第一个字节为最大长度,第二个字节为实际长度,
For i = 14 To 13 + rcvstr(13)
strData = strData + Chr(rcvstr(i))
Next
R_Str.Text = strData
'时钟脉冲
R_M.Text = String(8 - Len(TranToBin(CInt(rcvstr(268)))), "0") & TranToBin(CInt(rcvstr(268)))
ErrProc:
'MsgBox "数据接收失败", vbCritical, "网络传输"
End Sub
[/COLOR]
'====================================
我的要求是怎么能把返回的脉冲信号,变成返回I0.0、I0.1、I0.2、I0.3这几个的通断状态?
1200与VB通过TCP进行通讯? 已锁定
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-1200系列

共有15108条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。