西門子S7-300通訊協議不公開,我們無法按相應的協議寫程序,但是西門子提供給我們更為簡單的方式來與之通訊。
大家可以在某些組態軟件中找到這樣一個DLL:w95_s7.dll,就是這個DLL,使的我們與PLC進行數據交互極為簡單
在DLL時定義了如下一些接口函數:
Public Declare Function load_tool Lib "w95_s7.dll" (ByVal nrAs Byte, ByVal dev As String, adr As Type_PlcAddressType) As Long
這個函數是初始化連接用的,這個過程比較慢,大約要20S左右,這大概也是西門子為什麼啟動那麼慢的原因吧;包括了如下幾個參數:nr是指激活的連接數,範圍是1-4
dev是設備名,SetPG/PC裏麵有這個指定,一般用S7ONLINE就可以了,adr是指參數表,它是這樣的一個type:
Type Type_PlcAddressType
bytAddress As Byte’這是站號,默認是2
bytPlcSegmentID As Byte’SegmentID,默認是0
bytPlcSlotNo As Byte’槽號,默認是2
bytPlcRackNo As Byte’Rack號,默認是0
End Type
Public Declare Function new_ss Lib "w95_s7.dll" (ByVal nr As Byte) As Long
這個函數沒用到,可以去找一些資料來看
Public Declare Function unload_tool Lib "w95_s7.dll" () As Long’這個函數是程序退出時用的,用來斷開連接
’ no, amount, value
Public Declare Function d_field_read Lib "w95_s7.dll" (ByVal dbAs Long, ByVal nr As Long, ByVal anz As Long, value As Byte) As Long’這是讀取DB塊中數據的函數
db 是指DB塊號,比如DB10,則這個參數指定為10就可以了
nr 是指起始地址,比如讀DB10的第4個字節中數據,則指定為4
anz是指讀取的長度
value是返回的值,表麵上看這是一個字節,但實際上它是一個字節數組,比如你要讀取二十個字節的數據,那麼應定義dim ReturnValue(20) as byte,然後用ReturnValue來做為傳遞的參數
Public Declare Function d_field_write Lib "w95_s7.dll" (ByVal db AsLong, ByVal nr As Long, ByVal anz As Long, value As Byte) As Long
這是寫DB塊數據的函數,參數跟讀數據函數一樣,不多說了
’ no, amount, value
Public Declare Function e_field_read Lib "w95_s7.dll" (ByVal nr AsLong, ByVal anz As Long, value As Byte) As Long
‘這個是用來讀取外部輸入的值,包括開關量輸入,模擬量輸入
nr 是指起始地址
anz是指讀取的長度
value是返回的值,表麵上看這是一個字節,但實際上它是一個字節數組,比如你要讀取二十個字節的數據,那麼應定義dim ReturnValue(20) as byte,然後用ReturnValue來做為傳遞的參數
從分析也可以看出,隻有外部輸入的值不可以寫,因而它單獨存在
Public Declare Function a_field_read Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Byte) As Long
‘這是用來讀取外部輸出的值,包括開關量輸出,模擬量輸出,參數可以參照上麵的函數,
Public Declare Function a_field_write Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Byte) As Long
‘這是用來寫外部輸出的值,包括開關量輸出,模擬量輸出
nr 是指起始地址,
anz是指讀取的長度
value是返回的值
Public Declare Function m_field_read Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Byte) As Long
讀取內存變量的函數(M的值)
nr 是指起始地址
anz是指讀取的長度
value是返回的值
Public Declare Function m_field_write Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Byte) As Long
寫內存變量的函數
nr 是指起始地址
anz是指讀取的長度
value是返回的值
Public Declare Function t_field_read Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Integer) As Long
’讀定時器的值
nr 是指起始地址
anz是指讀取的長度
value是返回的值,這個返回的是整型量的值
Public Declare Function z_field_read Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Integer) As Long
‘讀計數器的值
nr 是指起始地址
anz是指讀取的長度
value是返回的值,這個返回的是整型量的值
Public Declare Function z_field_write Lib "w95_s7.dll" (ByValnr As Long, ByVal anz As Long, value As Integer) As Long
‘寫計數器的值
nr 是指起始地址
anz是指讀取的長度
value是返回的值,這個返回的是整型量的值
有了以上這樣函數,相信會VB的人都可以寫跟西門子通訊的程序了。
但是如何知道讀或寫是否成功呢,這就是每個函數的返回值來決定,返回為0時,說明操作成功,否則為通訊出錯。