首页 上一页 1 2 3 下一页 尾页

求助:台达plc和上位机modbus通讯的问题…… 点击:9633 | 回复:48



gongkongedit

    
  • 精华:1099帖
  • 求助:0帖
  • 帖子:14392帖 | 54470回
  • 年度积分:0
  • 历史总积分:622
  • 注册:2008年9月08日
发表于:2007-03-27 15:48:00
楼主
求助:台达plc和上位机modbus通讯的问题……

LD   X0
OUT  M1120
MOV  H86     D1120
LD   X0
OUT  M1143
END

我在程序里这样写了,然后用计算机发送报文01 03 00 00 00 02  6F F7 ,但是返回报文却是01 03 07 00 72 ,我想07应该是错误代码吧,但是又找不到相应的文档,是不是程序里面还应该有别的语句,请高手帮忙指点,谢谢……



lesing

  • 精华:1帖
  • 求助:0帖
  • 帖子:76帖 | 3076回
  • 年度积分:0
  • 历史总积分:5728
  • 注册:2005年4月13日
发表于:2009-06-25 13:45:45
41楼
還沒有成功通訊上?                            

丶努力

  • 精华:0帖
  • 求助:6帖
  • 帖子:10帖 | 39回
  • 年度积分:0
  • 历史总积分:366
  • 注册:2012年6月26日
发表于:2012-07-05 10:44:49
42楼

我爱工控,谢谢各位前辈。

happinessman88

  • 精华:0帖
  • 求助:0帖
  • 帖子:36帖 | 122回
  • 年度积分:0
  • 历史总积分:789
  • 注册:2010年5月02日
发表于:2012-07-22 19:17:40
43楼

‘用VB 写的 modbus rtu模式通讯源码, 以在台达PLC上调试通过

Private Sub CmdOpen_Click()
On Error Resume Next

If (MSComm1.PortOpen) Then   ‘打开/关闭串口
MSComm1.PortOpen = False
Else
MSComm1.PortOpen = True
End If

If (MSComm1.PortOpen) Then
CmdOpen.Caption = "关闭串口"
Shape5.FillStyle = vbFSSolid
Else
CmdOpen.Caption = "打开串口"
Shape5.FillStyle = vbFSTransparent
End If

If Err Then
MsgBox Error$, 48, "错误码信息"
Exit Sub
End If
End Sub

Private Sub Combo1_Click()
MSComm1.CommPort = Combo1.ListIndex + 1
End Sub

Private Sub Combo2_Click()
Call Setting
End Sub

Private Sub Combo3_Click()
Call Setting
End Sub

Private Sub Combo4_Click()
Call Setting
End Sub

Private Sub Combo5_Click()
Call Setting
End Sub

Private Sub Command1_Click()
‘Shape1.FillStyle = vbFSSolid
Dim Y0_status As Byte
Dim Sendstr As String
Dim i As Integer, j As Integer
Sendstr = "01 01 05 00 00 10 "
HexSend (Sendstr)


Sleep (30)

HexSend (Sendstr)
End Sub

Private Function HexSend(Sendstr As String) As Integer

Dim outbuf() As Byte
Dim Temp(0) As Byte
Dim crc As String, Sendstrls As String
Dim sendlen As Integer
Dim i As Integer, j As Integer

If Sendstr = "" Then
MsgBox "发送数据不能为空!"
HexSend = 0
Exit Function
End If

Sendstrls = Trim(Sendstr)   ‘去掉空格
sendlen = Len(Sendstrls) + 1 ‘取长度
j = 0
ReDim outbuf(1 To sendlen \ 3) As Byte
For i = 1 To sendlen Step 3
j = j + 1
outbuf(j) = Val("&H" & CStr(Mid(Sendstrls, i, 2)))
Next i

crc = Crc16(outbuf)
ReDim Preserve outbuf(1 To (sendlen \ 3 + 2)) As Byte       ‘加上CRC校验码
outbuf(sendlen \ 3 + 1) = Val("&H" & CStr(Mid(crc, 1, 2)))
outbuf(sendlen \ 3 + 2) = Val("&H" & CStr(Mid(crc, 3, 2)))

For i = 1 To (sendlen \ 3 + 2)
Temp(0) = outbuf(i)
MSComm1.Output = Temp
Next i
For i = 1 To 2000
Next i
HexSend = 1
End Function

Private Function Setting()
MSComm1.Settings = CStr(Combo2.Text) & "," & CStr(Combo3.Text) & "," & CStr(Combo4.Text) & "," & CStr(Combo5.Text)
End Function

Private Sub Command2_Click()
‘If (MSComm1.RThreshold = 0) Then
‘MSComm1.RThreshold = 1

‘Else
‘MSComm1.RThreshold = 0
‘End If
Label11.Caption = "接收个数:" & CStr(ReceCount) & " " & "接收帧数:" & CStr(Framecount)
End Sub

Private Sub Form_Load()
Combo1.AddItem ("COM1")
Combo1.AddItem ("COM2")
Combo1.AddItem ("COM3")
Combo1.AddItem ("COM4")
Combo1.AddItem ("COM5")
Combo1.ListIndex = 0

Combo2.AddItem ("2400")
Combo2.AddItem ("4800")
Combo2.AddItem ("9600")
Combo2.AddItem ("11520")
Combo2.ListIndex = 0

Combo3.AddItem ("E")
Combo3.AddItem ("O")
Combo3.AddItem ("N")
Combo3.ListIndex = 2

Combo4.AddItem ("6")
Combo4.AddItem ("7")
Combo4.AddItem ("8")
Combo4.ListIndex = 2

Combo5.AddItem ("1")
Combo5.AddItem ("2")
Combo5.ListIndex = 0

ReceCount = 0
End Sub

Private Function Crc16(data() As Byte) As String
      Dim CRC16Lo As Byte, CRC16Hi As Byte      ‘CRC寄存器
      Dim CL As Byte, CH As Byte                ‘多项式码&HA001
      Dim CrcLo As String, CrcHi As String
      Dim SaveHi As Byte, SaveLo As Byte
      Dim i As Integer
      Dim Flag As Integer
      CRC16Lo = &HFF
      CRC16Hi = &HFF
      CL = &H1
      CH = &HA0
      For i = 1 To UBound(data)
        CRC16Lo = CRC16Lo Xor data(i) ‘每一个数据与CRC寄存器进行异或
        For Flag = 0 To 7
          SaveHi = CRC16Hi
          SaveLo = CRC16Lo
          CRC16Hi = CRC16Hi \ 2            ‘高位右移一位
          CRC16Lo = CRC16Lo \ 2            ‘低位右移一位
          If ((SaveHi And &H1) = &H1) Then ‘如果高位字节最后一位为1
            CRC16Lo = CRC16Lo Or &H80      ‘则低位字节右移后前面补1
          End If                           ‘否则自动补0
          If ((SaveLo And &H1) = &H1) Then ‘如果LSB为1,则与多项式码进行异或
            CRC16Hi = CRC16Hi Xor CH
            CRC16Lo = CRC16Lo Xor CL
          End If
        Next Flag
      Next i
      If Len(Hex(CRC16Hi)) = 1 Then
         CrcHi = "0" + Hex(CRC16Hi)
      Else
         CrcHi = Hex(CRC16Hi)
      End If
      If Len(Hex(CRC16Lo)) = 1 Then
         CrcLo = "0" + Hex(CRC16Lo)
      Else
         CrcLo = Hex(CRC16Lo)
      End If
         Crc16 = CrcLo & CrcHi
End Function

Private Sub MSComm1_OnComm()
Dim inpu() As Byte
Dim i As Integer
Dim tempstr As String, Strdata As String

Select Case MSComm1.CommEvent
Case comEvReceive    ‘接收事件

  tempstr = MSComm1.Input
  inpu() = tempstr
 
  Framecount = Framecount + 1                      ‘帧个数加1
  If (Framecount = 1) Then
  framepoint(Framecount) = UBound(inpu) + 1         ‘第一帧帧尾
  Else
  framepoint(Framecount) = framepoint(Framecount - 1) + UBound(inpu) + 1     ‘第二帧开始指针
  End If
 
 
  For i = 0 To UBound(inpu)                    ‘将字符转换为数组
  If (Len(Hex(inpu(i))) = 1) Then
  Strdata = Strdata & "0" & Hex(inpu(i)) & " "
  Else
  Strdata = Strdata & Hex(inpu(i)) & " "
  End If
  Next i

  For i = ReceCount + 1 To UBound(inpu) + 1     ‘数据进入缓冲区
  Recebuf(i) = inpu(i - 1)
  Next
 
  ReceCount = ReceCount + UBound(inpu) + 1
 
  TextReceive.Text = TextReceive.Text & Strdata
  Strdata = ""

Case comEvSend
 
End Select

End Sub

Private Function RtuCheck(data() As Byte) As Integer

Dim CrcHi As Byte, CrcLo As Byte
Dim Checkdata() As Byte
Dim i As Integer
Dim crc As String

CrcHi = data(UBound(data))
CrcLo = data(UBound(data) - 1)
ReDim Checkdata(1 To (UBound(data) - 1)) As Byte


For i = 1 To (UBound(data) - 1) ‘附值
Checkdata(i) = data(i - 1)
Next

crc = Crc16(Checkdata)
If (CrcLo = Val("&H" & CStr(Mid(crc, 1, 2))) And CrcHi = Val("&H" & CStr(Mid(crc, 3, 2)))) Then
RtuCheck = 1
Else
RtuCheck = 0
End If

End Function

CS研创台达事业部

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2012年8月11日
发表于:2012-08-24 10:50:07
44楼

看来通讯确实是个有趣的简单而复杂的事情。

西门子LOGO!文档上针对通讯写着一句话:你糊弄它,它就糊弄你!!

通讯,从编程方式、硬件连接、抗干扰等等各方面都要细致考虑。

秦君

  • 精华:8帖
  • 求助:22帖
  • 帖子:148帖 | 4867回
  • 年度积分:1650
  • 历史总积分:39895
  • 注册:2005年6月28日
发表于:2012-08-25 02:15:17
45楼

COM1口(就是那个圆形编程通讯口)只支持MODBUS ASCII协议。自带的COM2口支持MODBUS RTU/ASCII协议。并且使用MODBUS RTU协议时只能8位数据位,我一般就用9600、8、无、1格式。其实在台达的编程手册中就可以看到 ,只是讲得比较乱。上位机通讯发送代码你要严格按《台达DVP系列PLC 通讯协议1.0》来。

yixiankeji

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 10回
  • 年度积分:0
  • 历史总积分:30
  • 注册:2013年5月21日
发表于:2013-08-20 10:28:20
46楼

大家好,我现在要用台达PLC ——SS2做modbus从机使用,跟电脑连接,电脑做主机,使用modbus RTU通讯,现在通讯不上,请各位大哥帮帮忙啊,我的QQ 252631158.谢谢了。

muzili1987

  • 精华:0帖
  • 求助:1帖
  • 帖子:1帖 | 14回
  • 年度积分:0
  • 历史总积分:50
  • 注册:2012年8月23日
发表于:2013-08-20 16:19:28
47楼

是不是驱动的问题,还有你选择的规约正确?

fyc871356965

  • 精华:1帖
  • 求助:3帖
  • 帖子:14帖 | 1802回
  • 年度积分:0
  • 历史总积分:2312
  • 注册:2012年1月09日
发表于:2013-08-20 18:55:41
48楼

引用 秦君 的回复内容: COM1口(就是那个圆形编程通讯口)只支持MODBUS...




热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页