通訊與組態(tài)]西門子S7-200與上位機通訊,讀取溫度值的程序范例!
PLC主程序
網(wǎng)絡1
// 設置控制方式為自由口通信方式,啟動接收字符中斷 //
PLC首次掃描
自由口通信,波特率為9600,數(shù)據(jù)位8,停止位1,無校驗
初始化RCV,允許RCV,有結束符,檢查空閑時間
字串6
結束符為 A
空閑時間為5MS
一次接收的最大字符為6個
啟動通信口,接收完成中斷
全局允許中斷
接收數(shù)據(jù)
LD SM0.1
MOVB 16#09, SMB30
MOVB 16#B0, SMB87
MOVB 16#0A, SMB89
MOVB 6, SMB94
ATCH INT_0, 23
ENI
RCV VB199, 0
網(wǎng)絡2
// 檢測溫度送VW0 //
轉換成實際溫度值
從工作站編號送到輸出緩沖區(qū)
檢測溫度送輸出緩沖區(qū)
LD SM0.0
MOVW AIW0, VW0
/I +54, VW0
MOVW AIW2, VW2
/I +54, VW2
MOVW 1, VW300
MOVW VW0, VW302
MOVW VW2, VW304
網(wǎng)絡3
// 設置溫度控制上限和下限//
LD SM0.0
MOVW +350, VW4
MOVW +450, VW6 字串7
網(wǎng)絡4
// 檢測溫度低于下限,則輸出加溫 //
LDW< VW0, VW4
A SM0.5
S Q0.0, 1
網(wǎng)絡5
// 檢測溫度高于上限,則輸出降溫 //
LDW> VW0, VW6
A SM0.5
R Q0.0, 1
網(wǎng)絡6
//準備傳送參數(shù) //
發(fā)送字節(jié)數(shù)據(jù),送VB99
發(fā)送檢測溫度數(shù)據(jù),送VW100
發(fā)送工作站編號數(shù)據(jù),送VW102
LD SM0.0
MOVB 6, VB99
MOVW VW300, VW100
MOVW VW302, VW102
MOVW VW304, VW104
網(wǎng)絡7
// 傳送數(shù)據(jù) //
LD SM0.5
XMT VB99, 0
中斷程序
網(wǎng)絡1
//通信口接收數(shù)據(jù)完成后的中斷 //
// SMB86 等于16#20,表示PLC收到結速符 //
收到結束符,把收到的數(shù)據(jù)傳到VB400
中斷有條件返回
否則繼續(xù)接收
LDB= SMB86, 16#20
MOVB VB200, VB400 字串5
CRETI
NOT
RCV VB199, 0
\\*******************************\\
VB源程序
Dim x1, k1, k2
Dim p11, p22 '定義變量
Dim aa() As Byte '定義數(shù)組
Private Sub Command1_Click() '開始監(jiān)控,定時器1有效
Timer1.Enabled = True
End Sub
Private Sub Command2_Click() '退事程序,定時器1無效
Timer1.Enabled = False
Cls '清屏 字串4
Unload Me
End Sub
Private Sub bbbb_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 '設定端口號 字串2
MSComm1.Settings = "9600,n,8,1" '設定通訊波特率
MSComm1.bbbbbLen = 6 '輸入緩沖區(qū)為6個字符
MSComm1.InBufferSize = 256 '接收緩沖器大小
MSComm1.OutBufferSize = 256 '輸出緩沖器大小
MSComm1.bbbbbMode = combbbbbModeBinary '以二進制傳輸
MSComm1.OutBufferCount = 0 '清空發(fā)送緩沖區(qū)
MSComm1.InBufferCount = 0 '清空接收緩沖區(qū)
End Sub
Private Sub Timer1_Timer() '定時器1有效,觸發(fā)接收事件
字串8
MSComm1.PortOpen = True '打開端口
ReDim aa(0 To 5) '定義動態(tài)數(shù)組
k1 = 0 '識別PLC站號,為1
If k1 = 0 Then MSComm1.Output = "1" + Chr(10) + Chr(13) '發(fā)送
Do While MSComm1.InBufferCount = 0 '準備接收數(shù)據(jù)
字串4
Loop
aa = MSComm1.bbbbb '接收數(shù)據(jù)存入數(shù)組
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#爐的溫度曲線,為紅色
字串9
Picture1.PSet (x1, p22), vbBlue '繪制2#爐的溫度曲線,為黃色
Text1.Text = Str(p11) '輸出1#爐溫度值
Text2.Text = Str(p22) '輸出2#爐溫度值
Text3.Text = Str(x1) '輸出監(jiān)控時間
End Sub










