首頁 > 新聞係統 > 嵌入式係統 > 嵌入式係統技術 正文 > 論壇 返回 打印

VB與西門子S7-300的通訊方式

  西門子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時,說明操作成功,否則為通訊出錯。

 



http://www.autooo.net/autooo/qianrushixitong/jishu/2007-12-16/43799.html