| 作者 | 主题 |
|---|---|
|
铁人第二 游侠 经验值:306 发帖数:173 精华帖:1 |
楼主
主题:S7-200 自由口通讯程序 方式A
说明:PC机定时读取PLC VW区温度数据,进行显示并绘制曲线.
PLC程序,为方便贴出,已转换为STL TITLE=程序注释 Network 1 // 网络标题 // 设置控制方式为自由口通信方式,启动接收字符中断 // PLC首次扫描 // 自由口通信,波特率为9600,数据位8,停止位1,无校验 // 初始化RCV,允许RCV,有结束符,检查空闲时间 // 结束符为 A // 空闲时间为5MS // 一次接收的最大字符为6个 // 启动通信口,接收完成中断 // 全局允许中断 // 接收数据 LD SM0.1 MOVB 16#09, SMB30 MOVB 16#B0, SMB87 MOVB 16#0A, SMB89 MOVB 6, SMB94 ATCH INT0, 23 ENI RCV VB199, 0 Network 2 // 检测温度送VW0 // 转换成实际温度值 // 从工作站编号送到输出缓冲区 // 检测温度送输出缓冲区 LD SM0.0 MOVW AIW0, VW0 /I +54, VW0 MOVW AIW2, VW2 /I +54, VW2 MOVW 1, VW300 MOVW VW0, VW302 MOVW VW2, VW304 Network 3 // // 设置温度控制上限和下限 LD SM0.0 MOVW +350, VW4 MOVW +450, VW6 Network 4 // // 检测温度低于下限,则输出加温 LDW< VW0, VW4 A SM0.5 S Q0.0, 1 Network 5 // 检测温度高于上限,则输出降温 LDW> VW0, VW6 A SM0.5 R Q0.0, 1 Network 6 //准备传送参数 // 发送字节数据,送VB99 // 发送检测温度数据,送VW100 // 发送工作站编号数据,送VW102 LD SM0.0 MOVB 6, VB99 MOVW VW300, VW100 MOVW VW302, VW102 MOVW VW304, VW104 Network 7 // 传送数据 LD SM0.5 XMT VB99, 0 TITLE=中断程序注释 Network 1 //通信口接收数据完成后的中断 // SMB86 等于16#20,表示PLC收到结速符 // 收到结束符,把收到的数据传到VB400 // 中断有条件返回 // 否则继续接收 LDB= SMB86, 16#20 MOVB VB200, VB400 CRETI NOT RCV VB199, 0 ///////////////////////////////////// VB源码 Dim x1, k1, k2 Dim p11, p22 '定义变量 Dim aa() As Byte '定义数组 Private Sub About_Click() frmAbout.Show End Sub Private Sub Command1_Click() '开始监控,定时器1有效 Timer1.Enabled = True End Sub Private Sub Command2_Click() '退事程序,定时器1无效 Timer1.Enabled = False Cls '清屏 Unload Me End Sub Private Sub Form_Load() '初始化 Timer1.Enabled = False '定时器1无效 Timer1.Interval = 100 '定时器1时间为0.1S Timer2.Enabled = True '定时器2有效 Timer2.Interval = 1000 '定时器2时间为1S Picture1.ScaleMode = 0 '定义纵横坐标 MSComm1.CommPort = 1 '设定端口号 MSComm1.Settings = "9600,n,8,1" '设定通讯波特率 MSComm1.InputLen = 6 '输入缓冲区为6个字符 MSComm1.InBufferSize = 256 '接收缓冲器大小 MSComm1.OutBufferSize = 256 '输出缓冲器大小 MSComm1.InputMode = comInputModeBinary '以二进制传输 MSComm1.OutBufferCount = 0 '清空发送缓冲区 MSComm1.InBufferCount = 0 '清空接收缓冲区 End Sub Private Sub Timer1_Timer() '定时器1有效,触发接收事件 MSComm1.PortOpen = True '打开端口 ReDim aa(0 To 5) '定义动态数组 k1 = 0 '识别PLC站号,为1 If k1 = 0 Then MSComm1.Output = "1" + Chr(10) + Chr(13) '发送 Do While MSComm1.InBufferCount = 0 '准备接收数据 Loop aa = MSComm1.Input '接收数据存入数组 If aa(0) > 64 Then GoTo xxx: k2 = Int(aa(0) * 255 + aa(1) * 1) Select Case k2 Case 1 p11 = Int(aa(2) * 255 + aa(3) * 1) p22 = Int(aa(4) * 255 + aa(5) * 1) Case Else End Select k1 = k1 + 1 If k1 > 2 Then k1 = 0 xxx: MSComm1.PortOpen = False End Sub Private Sub Timer2_Timer() '绘制各中频炉的温度曲线 x1 = x1 + 1 '时间增加为1S Picture1.PSet (x1, p11), vbRed '绘制1#炉的温度曲线,为红色 Picture1.PSet (x1, p22), vbBlue '绘制2#炉的温度曲线,为黄色 Text1.Text = Str(p11) '输出1#炉温度值 Text2.Text = Str(p22) '输出2#炉温度值 Text3.Text = Str(x1) '输出监控时间 End Sub |