注册名:

密码:

个人注册

企业注册

商务申请

商务管理平台

企业管理平台

个人管理平台

我的工控博客

中国工控网www.chinakong.com

首页 | 新闻中心 | 工控论坛 | 经验视点 | 工控商务 | 电气手册 | 工控博客 | 招聘求职 | 网上调查 | 企业中心 | 供求信息 | 资料中心 | 工控书店

所在位置:工控论坛 -- PLC论坛 -- 西门子PLC论坛 -- PLC网络通信

中国工控网搜索:

 自动化企业招聘

更多..

 登陆:密码:  注册  密码

搜索:

发表人:姜邵海 发表时间:2009/1/14 2:24:00  

 

 本栏论题: 西门子S7-200 ModBus从站通讯程序  [12155]

    说明:PLC从站,PC作主站,用ModBus协议进行通讯。PC机读取PLCVW区的数据;PC机还读取PLC内部I或者O地址的状态。
   
    ///////////////////////////////////////
   
    以下是PLC程序实现,方便贴出,已转换为STL
   
    TITLE=程序注释
   
    Network 1 // 网络标题
   
    // 在第一个循环周期内初始化Modbus从站协议
   
    LD SM0.1
   
    CALL SBR3, 1, 12, 9600, 0, 0, 128, 32, 1000, &VB0, M10.1, MB11
   
    Network 2
   
    // 在每个循环周期内执行Modbus 从站协议
   
    LD SM0.0
   
    CALL SBR1, M10.2, MB12
   
    Network 3
   
    LD SM0.0
   
    MOVW AIW0, VW100
   
    /I +54, VW100
   
    MOVW AIW2, VW102
   
    /I +54, VW102
   
    字串7
   
    MOVW AIW4, VW104
   
    /I +54, VW104
   
    MOVW AIW6, VW106
   
    /I +54, VW106
   
    Network 4
   
    LD SM0.0
   
    = Q0.0
   
    Network 5
   
    LD I0.0
   
    = Q0.1
   
    Network 6
   
    LD I0.1
   
    = Q0.2
   
    ///////////////////////////////////
   
    以下是VB源码
   
    Option Explicit
   
    Private Declare Function GetTickCount Lib "kernel32" () As Long
   
    Dim x1
   
    Dim p11, p12, p13, p14, p15, p16, p17, p18
   
    Function CRC16(data() As Byte) As String
   
    Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
   
    Dim CL As Byte, CH As Byte '多项式码&HA001
   
    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 = 0 To UBound(data)
   
    CRC16Lo = CRC16Lo Xor data(i) '每一个数据与CRC寄存器进行异或 字串1
   
    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
   
    Dim ReturnData(1) As Byte
   
    ReturnData(0) = CRC16Hi 'CRC高位
   
    ReturnData(1) = CRC16Lo 'CRC低位
   
    CRC16 = ReturnData
   
    End Function
   
    Private Sub About_Click()
   
    frmAbout.Show
   
    End Sub
   
    Private Sub Form_Load() '初始化
   
    Timer1.Enabled = False '定时器1无效
   
    Timer1.Interval = 1000 '定时器1时间为1S
   
    Timer2.Enabled = True '定时器2有效
   
    Timer2.Interval = 1000 '定时器2时间为1S
    字串4
   
   
    Text1.Text = ""
   
    Text2.Text = ""
   
    Text3.Text = ""
   
    Text4.Text = ""
   
    Text5.Text = ""
   
    Text6.Text = ""
   
    Text8.Text = ""
   
    Text10.Text = ""
   
    MSComm1.CommPort = 1 '设定端口号
   
    MSComm1.Settings = "9600,n,8,1" '设定通讯波特率
   
    MSComm1.InBufferSize = 1024 '接收缓冲器大小
   
    MSComm1.OutBufferSize = 1024 '输出缓冲器大小
   
    MSComm1.InputMode = comInputModeBinary '以二进制传输
   
    MSComm1.RThreshold = 1 '
   
    MSComm1.SThreshold = 0
   
    MSComm1.InputLen = 0 '读取接收缓冲器所有字符
   
    MSComm1.OutBufferCount = 0 '清空发送缓冲区
   
    MSComm1.InBufferCount = 0 '清空接收缓冲区
   
    If MSComm1.PortOpen = False Then
   
    Command3.Caption = "打开串口"
   
    Else
   
    Command3.Caption = "关闭串口"
   
    End If
   
    End Sub
   
    Private Sub Command1_Click() 字串8
   
    Timer1.Enabled = True
   
    End Sub
   
    Private Sub Command2_Click() '退出程序,定时器1无效
   
    Timer1.Enabled = False
   
    Cls
   
    Unload Me
   
    End Sub
   
    Private Sub Command3_Click()
   
    On Error Resume Next
   
    If MSComm1.PortOpen = False Then
   
    MSComm1.PortOpen = True
   
    Else
   
    MSComm1.PortOpen = False
   
    End If
   
    If MSComm1.PortOpen Then '打开关闭按钮显示文字
   
    Command3.Caption = "关闭串口"
   
    Else
   
    Command3.Caption = "打开串口"
   
    End If
   
    If Err Then '打开串口失败,则显示出错信息
   
    MsgBox Error$, 48, "错误信息"
   
    Exit Sub
   
    End If
   
    End Sub
   
    Private Sub Timer1_Timer() '读V存储区数据
   
    Dim CRC() As Byte
   
    Dim FGetData As String
   
    Dim aa() As Byte
   
    Dim s As String
   
    Dim str As String
   
    Dim i As Integer
   
    Dim bb, cc As String
   
    ReDim aa(5) As Byte '定义动态数组
   
    aa(0) = &HC
   
    aa(1) = &H3
   
    aa(2) = &H0
   
    aa(3) = &H32
   
    aa(4) = &H0
   
    aa(5) = &H4
   
    CRC = CRC16(aa)
   
    str = CRC
   
    s = ""
   
    For i = 1 To LenB(str)
   
    s = s + Hex(AscB(MidB(str, i, 1)))
   
    Next i
   
    bb = Right(s, 2)
   
    cc = Mid(s, 1, 2)
   
    If Len(s) < 4 Then
   
    cc = Mid(s, 1, 1)
   
    End If
   
    ReDim Preserve aa(0 To 7) As Byte
   
    aa(6) = Val("&H" & bb)
   
    aa(7) = Val("&H" & cc)
   
    MSComm1.OutBufferCount = 0 '清空输出寄存器
   
    MSComm1.Output = aa
   
    FGetData = ReceiveData
   
    Text5.Text = FGetData
   
    p11 = Val("&H" & Mid(FGetData, 7, 4))
   
    p12 = Val("&H" & Mid(FGetData, 11, 4)) 字串1
   
    p13 = Val("&H" & Mid(FGetData, 15, 4))
   
    p14 = Val("&H" & Mid(FGetData, 19, 4))
   
    End Sub
   
    Private Sub Command4_Click() 'I状态
   
    Dim CRC() As Byte
   
    Dim FGetData As String
   
    Dim aa() As Byte
   
    Dim s As String
   
    Dim str As String
   
    Dim i As Integer
   
    Dim bb, cc As String
   
    ReDim aa(5) As Byte '定义动态数组
   
    aa(0) = &HC
   
    aa(1) = &H2
   
    aa(2) = &H0
   
    aa(3) = &H0
   
    aa(4) = &H0
   
    aa(5) = &H1
   
    CRC = CRC16(aa)
   
    str = CRC
   
    s = ""
   
    For i = 1 To LenB(str)
   
    s = s + Hex(AscB(MidB(str, i, 1)))
   
    Next i
   
    bb = Right(s, 2)
   
    cc = Mid(s, 1, 2)
   
    If Len(s) < 4 Then
   
    cc = Mid(s, 1, 1)
   
    End If
   
    ReDim Preserve aa(0 To 7) As Byte
   
    aa(6) = Val("&H" & bb)
    字串9
    aa(7) = Val("&H" & cc)
   
    MSComm1.OutBufferCount = 0 '清空输出寄存器
   
    MSComm1.Output = aa
   
    FGetData = IReceiveData
   
    p17 = Val("&H" & Mid(FGetData, 7, 2))
   
    p18 = Val("&H" & Mid(FGetData, 9, 2))
   
    End Sub
   
    Private Sub Command5_Click() 'Q状态
   
    Dim CRC() As Byte
   
    Dim FGetData As String
   
    Dim aa() As Byte
   
    Dim s As String
   
    Dim str As String
   
    Dim i As Integer
   
    Dim bb, cc As String
   
    ReDim aa(5) As Byte '定义动态数组
   
    aa(0) = &HC
   
    aa(1) = &H1
   
    aa(2) = &H0
   
    aa(3) = &H0
   
    aa(4) = &H0
   
    aa(5) = &H1
   
    CRC = CRC16(aa)
   
    str = CRC
   
    s = ""
   
    For i = 1 To LenB(str)
   
    s = s + Hex(AscB(MidB(str, i, 1)))
   
    Next i
   
    bb = Right(s, 2)
   
    cc = Mid(s, 1, 2)
   
    If Len(s) < 4 Then 字串4
   
    cc = Mid(s, 1, 1)
   
    End If
   
    ReDim Preserve aa(0 To 7) As Byte
   
    aa(6) = Val("&H" & bb)
   
    aa(7) = Val("&H" & cc)
   
    MSComm1.OutBufferCount = 0 '清空输出寄存器
   
    MSComm1.Output = aa
   
    FGetData = QReceiveData
   
    p15 = Val("&H" & Mid(FGetData, 7, 2))
   
    p16 = Val("&H" & Mid(FGetData, 9, 2))
   
    End Sub
   
    Private Function ReceiveData() As String '返回V存储器区数据
   
    Dim FGetData As String
   
    Dim t1 As Long
   
    Dim av As Variant
   
    Dim i As Integer
   
    Dim ReDataLen As Integer
   
    FGetData = ""
   
    t1 = GetTickCount() '取时间,做延时用
   
    Do '循环等待接收数据
   
    DoEvents
   
    If MSComm1.InBufferCount > 0 Then '串口有数据了
   
    ReDataLen = MSComm1.InBufferCount '取数据长度
   
    av = MSComm1.Input '将串口数据取出来
   
    For i = 0 To ReDataLen - 1 字串2
   
    FGetData = FGetData & Right("00" & Hex(av(i)), 2)
   
    Next i
   
    End If
   
    If Len(FGetData) >= 6 Then
   
    If Len(FGetData) > Val("&H" & Mid(FGetData, 5, 2)) * 2 + 8 Then
   
    ReceiveData = FGetData
   
    Exit Function
   
    End If
   
    End If
   
    If GetTickCount - t1 > 2000 Then '2秒没收完就不收了
   
    ReceiveData = ""
   
    Exit Function
   
    End If
   
    Loop
   
    End Function
   
    Private Function IReceiveData() As String '反回I状态
   
    Dim FGetData As String
   
    Dim t1 As Long
   
    Dim av As Variant
   
    Dim i As Integer
   
    Dim ReDataLen As Integer
   
    FGetData = ""
   
    t1 = GetTickCount() '取时间,做延时用
   
    Do '循环等待接收数据
   
    DoEvents
   
    If MSComm1.InBufferCount > 0 Then '串口有数据了
   
    ReDataLen = MSComm1.InBufferCount '取数据长度
   
    av = MSComm1.Input '将串口数据取出来
   
    For i = 0 To ReDataLen - 1
   
    FGetData = FGetData & Right("00" & Hex(av(i)), 2)
   
    Next i
   
    End If
   
    If Len(FGetData) >= 6 Then
   
    If Len(FGetData) > Val("&H" & Mid(FGetData, 5, 2)) * 2 + 8 Then
   
    IReceiveData = FGetData
   
    Exit Function
   
    End If
   
    End If
   
    If GetTickCount - t1 > 2000 Then '2秒没收完就不收了
   
    IReceiveData = ""
   
    Exit Function
   
    End If
   
    Loop
   
    End Function
   
    Private Function QReceiveData() As String '反回Q状态
   
    Dim FGetData As String
   
    Dim t1 As Long
   
    Dim av As Variant
   
    Dim i As Integer
   
    Dim ReDataLen As Integer
   
    FGetData = ""
   
    t1 = GetTickCount() '取时间,做延时用
   
    Do '循环等待接收数据
   
    DoEvents
   
    If MSComm1.InBufferCount > 0 Then '串口有数据了
    字串1
   
   
    ReDataLen = MSComm1.InBufferCount '取数据长度
   
    av = MSCo

以下是关于《西门子S7-200 ModBus从站通讯程序》论题的回复(共13篇)

回复人:cn18show 

 回复时间:2009/9/18 17:07:00

支持(597) | 反对(469)

 

    易展仪表展览网成立五周年活动拉开序幕,50万回馈,官方网址:http://www.18show.cn/5/?m=189

回复人:tangwxx 

 回复时间:2009/10/30 14:21:00

支持(1119) | 反对(593)

 

    学习了

回复人:missanna 

 回复时间:2010/4/16 11:57:00

支持(498) | 反对(524)

 

    挺好的论题,顶一下

回复人:gis100 

 回复时间:2010/6/3 15:54:00

支持(1744) | 反对(454)

 

    ●三菱|西门子|欧姆龙|AB/松下|PLC相关视频●模_具_视频教程●数控编程●
    ▆▆▆▆▆▆▆三菱 -PLC相关视频▆▆▆▆▆▆
    三菱PLC视频
    三菱FX2N视频
    三菱特殊功能模块应用技术视频
    三菱定位模块教学视频
    三菱PLC通信技术视频
    三菱伺服应用技术教程
    三菱步进应用视频教程
    三菱触摸屏应用视频教程
    三菱特殊功能模块视频教程
    步进电机教学视频
    三菱变频器视频教程
    三菱伺服控制系统应用技术视频
    ▆▆▆▆▆▆西门子-PLC相关视频▆▆▆▆▆▆
    西门子PLC S7-200 视频
    西门子S7-300PLC step7 多媒体视频教程
    西门子LOGO多媒体视频教程
    西门子PLC视频S7-200视频教程
    西门子PLC视频S7-300,
    西门子PLC视频S7-400,
    西门子PLC视频Wincc视频教程
    西门子自动化PLC等多媒体视频教程及资料集
    ▆▆▆▆▆▆欧姆龙 -PLC相关视频▆▆▆▆▆
    欧姆龙可编程控制器视频
    欧姆龙原理编程应用视频教材
    ▆▆▆▆▆▆AB-PLC相关视频▆▆▆▆▆▆▆▆
    AB PLC视频教程PLC培训32讲
    ▆▆▆▆▆▆松下-PLC相关视频▆▆▆▆▆▆▆
    松下FP1 PLC视频石油大学电气控制可编程控制
    ----------------------------------------
    自学模具推荐 >>UG精品教学视频-Pro/E视频-AutoCAD视频
    SolidWorks视频教程-CATIA视频-Moldflow视频教程
    数控编程 >>MasterCAM视频-Powermill视频
    CimaTron视频-CAXA系列-EdgeCAM
    逆向工程 >>Surface视频-imageware-Geomagic教学
    统达TwinCAD视频-I-DEAS视频教程-PressCAD统赢
    Rhino 犀牛教程-PowerSHAPE视频
    ----------------------------------
    →篇幅有限,意者请直接QQ联系QQ:759737833
    E-MAIL:759737833@qq.com
    MSN:jxb200200@hotmail.com
   
   
    (知心365学习中心-|电子|单片机|嵌入式|linux|通讯|ARM|计算机|编程设计|机械|医学|外语日语英语法语|金
   
    融|培训视频资料|职业职称考试|考研|大学教程|升学考试|财务|经营管理|网络|模具设计|成人考试|资格考试|
   
    芯片级电脑显示器笔记本数码主板手机硬盘复印机打印机维修|自学考试|研究生入学考试视频教程资料汇总)
   
   

回复人:jxsrsx 

 回复时间:2010/9/19 20:46:00

支持(438) | 反对(488)

 

    学习了

回复人:jxsrsx 

 回复时间:2010/9/19 20:49:00

支持(428) | 反对(406)

 

    很好

回复人:jxsrsx 

 回复时间:2010/9/19 20:50:00

支持(380) | 反对(711)

 

    谢谢

回复人:陈健刚 

 回复时间:2011/8/2 8:57:00

支持(514) | 反对(544)

 

    很牛。慢慢学习。感谢分享。

回复人:sparrow657 

 回复时间:2011/12/13 11:23:00

支持(657) | 反对(444)

 

    有点像天书

回复人:huang15983 

 回复时间:2011/12/13 11:26:00

支持(583) | 反对(609)

 

    这个强力支持楼主

回复人:aipengtech 

 回复时间:2013/8/1 10:48:00

支持(475) | 反对(408)

 

    这个强力支持楼主 http://t.cn/zQinTVK

回复人:li337000 

 回复时间:2014/9/4 16:47:00

支持(316) | 反对(359)

 

    了解了解

回复人:cxkuii 

 回复时间:2025/4/26 8:54:00

支持(3) | 反对(4)

 

    完全看不懂

如果要回复本栏论题,请首先中国工控网www.chinakong.com

·如果你已经是中国工控网www.chinakong.com成员,请直接登录。

·如果你还不是中国工控网www.chinakong.com成员,请首先注册,注册为免费!

注册名:

密  码:

           注册中国工控网www.chinakong.com
           忘记密码

关闭该窗口

关于我们     免责声明     服务项目     广告联系     友情链接     联系方式     意见反馈     设为首页     加入收藏

 ©2023-2025 中国工控网(www.chinakong.com) 版权所有 豫ICP备17046657号

管理员信箱:chinakong98@163.com  服务热线:13525974529

洛阳博德工控自动化技术有限公司

中国    洛阳