(無錫市北辰自動(dòng)化技術(shù)有限公司 張鵬 2007-10-16)
一、概述
Hilscher NETLINK用于將西門子MPI協(xié)議轉(zhuǎn)換為以太網(wǎng)TCP/IP協(xié)議痘宋,并提供公開的無需授權(quán)的驅(qū)動(dòng)函數(shù)庫。
NETLINK有三種應(yīng)用:
1淡箱、對于僅僅需要STEP7編程〓叕乁6弐児〓和WINCC監(jiān)控塌瑞,安裝IBHNET127驅(qū)動(dòng)即可,該驅(qū)動(dòng)安裝后將在控制面板的Set PG/PC Interface中添加IBHNet MPI/PPI/Profibus三個(gè)驅(qū)動(dòng)連接灸叼;將STEP7(S7 ONLINE)和WINCC(MPI)的訪問點(diǎn)指向以上驅(qū)動(dòng)連接即可神汹。
2、對于第三方組態(tài)軟件(如KingView古今、iFix等)通過NETLINK訪問PLC屁魏,選擇我公司開發(fā)的OPCServer。
3捉腥、對于VB或者VC++(6.0以上版本)的自行開發(fā)界面氓拼,有兩種方法實(shí)現(xiàn)通訊:
l 調(diào)用Hilscher提供的IP Driver驅(qū)動(dòng)函數(shù)庫進(jìn)行通訊;
l 使用winsock控件進(jìn)行通訊抵碟;
本文對在VB6.0中通過Hilscher IP Driver驅(qū)動(dòng)庫讀寫S7300/400 PLC數(shù)據(jù)的基本開發(fā)步驟作簡要描述桃漾,具體資料可以參考NETLINK光盤netDEVICE System Software中的Nlmpi_pie.pdf和Drv_Ip.pdf文件,該光盤可到 (暫不可見)/co/beichen-automation/index_download.asp 頁面中下載拟逮。
二撬统、平臺和配置
1适滓、平臺:WINDOW2000+SP4,Microsoft VB6.0恋追;
2番恭、軟件和驅(qū)動(dòng)安裝:Hilscher SYCON軟件和IP Driver;
3恕孙、硬件要求:NETLINK電纜一根坠诈,西門子S7300 CPU一臺(如CPU314),以太網(wǎng)交換機(jī)一臺(如TP-LINK)帘缤,以太網(wǎng)電纜扯氯;
4、系統(tǒng)配置:如下圖所示
〓叕乁4弐児〓
三憋屑、NETLINK參數(shù)配置
如上圖所示烟内,將計(jì)算機(jī)網(wǎng)卡的IP地址配置為192.168.1.10,將NETLINK的RJ45端口鏈接到交換機(jī)端口上氨固,另一端插入CPU314的MPI通訊口蛀埂,NETLINK是由CPU314的MPI口供電的。如果CPU上已經(jīng)連接了其他監(jiān)控設(shè)備如觸摸屏解瀑,則可以選用西門子帶編程口的網(wǎng)絡(luò)插頭盾轮。
在NETLINK鏈接到MPI端口后的三分鐘內(nèi)(上電三分鐘內(nèi))運(yùn)行[開始]-[程序]-[Hilscher IP Driver]-[NetIdent Demo Program],點(diǎn)擊[Start Poll]按鈕自動(dòng)查找網(wǎng)絡(luò)上的NETLINK蛛蒙,找到后將會顯示NETLINK信息糙箍,NETLINK出廠默認(rèn)IP地址為0.0.0.0,選擇顯示的NETLINK并點(diǎn)擊[Set IP]按鈕牵祟,設(shè)置IP地址為192.168.1.88深夯;如果軟件找不到NETLINK,請用PING命令檢查網(wǎng)絡(luò)是否鏈接正確诺苹。
注意1:通過NetIdent設(shè)定的IP地址是臨時(shí)的咕晋,在NETLINK再次上電后將自動(dòng)恢復(fù)到原來的IP地址;
注意2:NETLINK上電的三分鐘內(nèi)允許通過NetIdent設(shè)定其IP地址收奔,三分鐘后設(shè)定將被拒絕掌呜;
設(shè)定好NETLINK的IP地址后運(yùn)行[開始]-[程序]-[SyCon System Configurator],新建項(xiàng)目并添加NETLINK設(shè)備坪哄,雙擊NETLINK并設(shè)定網(wǎng)絡(luò)參數(shù)质蕉,IP地址設(shè)為192.168.1.88,選擇自動(dòng)檢測接口和自動(dòng)速率識別翩肌,NETLINK的MPI地址設(shè)定為1(注意不要和MPI網(wǎng)絡(luò)上其他站點(diǎn)地址沖突)模暗;設(shè)定好參數(shù)后將其下載到NETLINK。(具體可以參考《NetLINK和IBHNet驅(qū)動(dòng)在SIEMENS STEP7 WINCC中的使用說明.doc》中的描述)
注意3:通過SYCON軟件設(shè)定的IP地址是永久固定的,在NETLINK再次上電后不會改變沽票;
四撤筐、IP Driver參數(shù)配置
運(yùn)行[開始]-[程序]-[Hilscher IP Driver]-[IP Driver Setup],在Connection 0中輸入NETLINK的IP地址:192.168.1.88绅荒、1099知祠、TCP、Client肝羊、5000;
運(yùn)行[開始]-[程序]-[Hilscher IP Driver]-[IP Driver Test]伪浅,在菜單[Connection select]中選擇Connection 0子特,連接后進(jìn)行其他菜單的測試,如[Driver Info]等惕衩,如果測試正常說明IP Driver已連接到NETLINK挨伯。
五、VB應(yīng)用
應(yīng)用舉例:
1协超、 按下[循環(huán)啟動(dòng)]按鈕后周期性讀取MW0的數(shù)值(間隔100ms)履绎,直到按下[停止]按鈕。
2雕什、 按下[寫入新值]按鈕命令將新值寫入MW0缠俺。
3、 [復(fù)位NETLINK]按鈕初始化NETLINK贷岸。
演示界面如下圖所示:
〓叕乁5弐児〓
開發(fā)步驟:
1壹士、 新建VB EXE工程,將NETLINK光盤中Api\Demo\VBASIC32\CIFUSER.BAS模板文件復(fù)制到VB工程中并取消只讀屬性偿警;然后添加到工程中躏救,打開CIFUSER.BAS模板,加入以下常數(shù)申明:
'新增常數(shù)
Public Const TASK_TDT_UINT8 = 5
Public Const TASK_TFC_READ = 1
Public Const TASK_TFC_WRITE = 2
2螟蒸、 新建模塊Module1盒使,添加以下公共變量和API函數(shù):
Public Const usSize = 288 '消息長度常數(shù)=288
Public SndMsgRead As MSG_STRUC '讀取MW0數(shù)據(jù)的消息
Public SndMsgWrite As MSG_STRUC '寫MWO數(shù)據(jù)的消息
Public SndMsgReset As MSG_STRUC '復(fù)位NETLINK的消息
Public RcvMsg As MSG_STRUC '接收消息
'內(nèi)存拷貝API
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
3唧垦、 在Form1代碼窗口中添加讀寫控制變量峡审、三個(gè)消息初始化函數(shù)、NETLINK鏈接和讀寫函數(shù)(請參考Nlmpi_pie.pdf文件):
Dim bNetLink_Connected As Boolean 'NETLINK鏈接標(biāo)記
Dim bStartRead As Boolean '開始循環(huán)讀取標(biāo)記
Dim bWrite As Boolean '寫數(shù)據(jù)標(biāo)記
'初始化讀MW0數(shù)據(jù)的消息
Private Function Initial_SndMsgRead()
SndMsgRead.rx = 3 '接收號=3
SndMsgRead.tx = 255 '發(fā)送號=255
SndMsgRead.ln = 8 '讀數(shù)據(jù)長度=8
SndMsgRead.nr = 0 '消息號
SndMsgRead.a = 0 '應(yīng)答號=0
SndMsgRead.f = 0 '錯(cuò)誤號=0
SndMsgRead.b = 0 '命令碼=16#33(M區(qū)數(shù)據(jù))
SndMsgRead.e = 0 '擴(kuò)展號=0
SndMsgRead.data(0) = 2 'S7300 CPU的MPI地址=2
SndMsgRead.data(1) = 0 '數(shù)據(jù)區(qū)=0
SndMsgRead.data(2) = 0 'M區(qū)起始地址=0(起始地址 MOD 256)
SndMsgRead.data(3) = 0 'M區(qū)起始地址=0(起始地址 / 256)
SndMsgRead.data(4) = 0 '數(shù)據(jù)索引=0(僅用于DB區(qū))
SndMsgRead.data(5) = 2 '讀取的字節(jié)數(shù)=2 (MW0)
SndMsgRead.data(6) = TASK_TDT_UINT8 '數(shù)據(jù)類型=TASK_TDT_UINT8(字節(jié))
SndMsgRead.data(7) = TASK_TFC_READ '功能號=TASK_TFC_READ(讀數(shù)據(jù))
End Function
'初始化寫MW0數(shù)據(jù)的消息
Private Function Initial_SndMsgWrite()
SndMsgWrite.rx = 3 '接收號
SndMsgWrite.tx = 255 '發(fā)送號
SndMsgWrite.ln = 10 '寫數(shù)據(jù)長度=10
SndMsgWrite.nr = 0 '消息號
SndMsgWrite.a = 0 '應(yīng)答號=0
SndMsgWrite.f = 0 '錯(cuò)誤號=0
SndMsgWrite.b = 0 '命令碼=16#33(M區(qū)數(shù)據(jù))
SndMsgWrite.e = 0 '擴(kuò)展號=0
SndMsgWrite.data(0) = 2 'S7300 CPU的MPI地址=2
SndMsgWrite.data(1) = 0 '數(shù)據(jù)區(qū)=0
SndMsgWrite.data(2) = 0 'M區(qū)起始地址=0(起始地址 MOD 256)
SndMsgWrite.data(3) = 0 'M區(qū)起始地址=0(起始地址 / 256)
SndMsgWrite.data(4) = 0 '數(shù)據(jù)索引=0(僅用于DB區(qū))
SndMsgWrite.data(5) = 0 '要寫的字節(jié)數(shù)=2 (MW0)
SndMsgWrite.data(6) = TASK_TDT_UINT8 'TASK_TDT_UINT8
SndMsgWrite.data(7) = TASK_TFC_WRITE 'TASK_TFC_WRITE
SndMsgWrite.data(8) = 0 '待寫數(shù)據(jù)低字節(jié)=0
SndMsgWrite.data(9) = 0 '待寫數(shù)據(jù)高字節(jié)=0
End Function
'初始化復(fù)位NETLINK消息
Private Function Initial_SndMsgReset()
SndMsgReset.rx = 0 '接收號=0(NETLINK 系統(tǒng))
SndMsgReset.tx = 255 '發(fā)送號
SndMsgReset.ln = 1 '數(shù)據(jù)長度
SndMsgReset.nr = 1 '消息號
SndMsgReset.a = 0 '應(yīng)答號=0
SndMsgReset.f = 0 '錯(cuò)誤號=0
SndMsgReset.b = 1 '命令碼=1
SndMsgReset.e = 0 '擴(kuò)展號=0
SndMsgReset.data(0) = 1 '=1
End Function
'NETLINK鏈接
Private Function NetLINK_Connect()
Dim sRet As Integer
sRet = DevOpenDriver(0) '打開驅(qū)動(dòng)
If sRet = DRV_NO_ERROR Then
sRet = DevInitBoard(0, 0) '初始化板卡
If sRet = DRV_NO_ERROR Then
bNetLink_Connected = True '設(shè)置NETLINK鏈接標(biāo)記
Else
MsgBox "找不到NETLINK!", vbCritical + vbOKOnly, "錯(cuò)誤"
DevExitBoard 0 '退出板卡
DevCloseDriver 0 '關(guān)閉驅(qū)動(dòng)
End If
Else
MsgBox "找不到NETLINK驅(qū)動(dòng)!", vbCritical + vbOKOnly, "錯(cuò)誤"
DevExitBoard 0
DevCloseDriver 0
End If
End Function
'讀MW0數(shù)據(jù)
Private Function ReadValue()
Dim sRet As Integer, RcvData(0 To 1) As Byte, Val_INT16 As Integer
sRet = DevPutMessage(0, SndMsgRead, 500) '發(fā)送讀取數(shù)據(jù)的消息
If sRet = DRV_NO_ERROR Then '如果發(fā)送消息無錯(cuò)誤
sRet = DevGetMessage(0, usSize, RcvMsg, 500) '接收返回消息
'如果接收無錯(cuò)誤且消息無錯(cuò)誤且功能號為讀取消息則接收消息中的MW0數(shù)據(jù)
If sRet = DRV_NO_ERROR And RcvMsg.f = 0 And RcvMsg.data(7) = TASK_TFC_READ Then
RcvData(0) = RcvMsg.data(9) '注意高低字節(jié)的顛到
RcvData(1) = RcvMsg.data(8)
CopyMemory Val_INT16, RcvData(0), 2
Text_Value.Text = Val_INT16
End If
End If
End Function
'寫MW0數(shù)據(jù)
Private Function WriteValue()
Dim sRet As Integer, SndData(0 To 1) As Byte, Val_INT16 As Integer
Val_INT16 = Int(Text_Setting.Text)
CopyMemory SndData(0), Val_INT16, 2
SndMsgWrite.data(8) = SndData(1) '注意高低字節(jié)的顛到
SndMsgWrite.data(9) = SndData(0)
sRet = DevPutMessage(0, SndMsgWrite, 500) '發(fā)送寫數(shù)據(jù)的消息
If sRet = DRV_NO_ERROR Then '如果發(fā)送消息無錯(cuò)誤
sRet = DevGetMessage(0, usSize, RcvMsg, 500) '接收返回消息
End If
bWrite = False '復(fù)位寫值標(biāo)志
End Function
4旨剥、 在Form1添加定時(shí)器Timer1抄瑟,設(shè)定周期為100ms凡泣;在Timer1的執(zhí)行事件中添加以下代碼:
'定時(shí)器1的執(zhí)行代碼
Private Sub Timer1_Timer()
If bNetLink_Connected = False Then '如果NetLink沒有鏈接則退出定時(shí)器執(zhí)行
Exit Sub
End If
If bWrite = True Then '如果有寫值請求
WriteValue '寫MW0值
ElseIf bStartRead = True Then '否則檢查是否啟動(dòng)了讀循環(huán)
ReadValue '讀MW0值
End If
End Sub
5、 添加[循環(huán)讀取]拯奔、[停止]谭扑、[寫入新值]、[復(fù)位NETLINK]按鈕的動(dòng)作
'循環(huán)讀取按鈕
Private Sub Command_read_Click()
If bNetLink_Connected = False Then '如果NETLINK未鏈接
NetLINK_Connect '鏈接NETLINK
End If
If bNetLink_Connected = True Then '如果已鏈接
bStartRead = True '啟動(dòng)循環(huán)讀
End If
End Sub
'停止按鈕
Private Sub Command_stop_Click()
bStartRead = False
End Sub
'寫入新值按鈕
Private Sub Command_set_Click()
If IsNumeric(Text_Setting.Text) Then
bWrite = True
Else
MsgBox "設(shè)定值錯(cuò)誤,范圍:-32768至32767", vbExclamation + vbOKOnly, "格式錯(cuò)誤"
End If
End Sub
'復(fù)位NETLINK按鈕
Private Sub Command_reset_Click()
Dim sRet As Integer
If bStartRead = True Then
MsgBox "復(fù)位NETLINK前請先停止循環(huán)讀取优诵。", vbInformation + vbOKOnly, "提示"
Else
sRet = DevPutMessage(0, SndMsgReset, 500) '發(fā)送復(fù)位NETLINK的消息
End If
End Sub
6吟筷、 在Form1的Load事件中添加初始化代碼:
'Form1裝載
Private Sub Form_Load()
bStartRead = False
bWrite = False
bNetLink_Connected = False
Text_Value.Text = 0
Text_Setting.Text = 0
Initial_SndMsgRead '初始化讀取數(shù)據(jù)消息
Initial_SndMsgWrite '初始化寫值消息
Initial_SndMsgReset '初始化復(fù)位消息
NetLINK_Connect '鏈接NETLINK
End Sub
六、注意事項(xiàng)
1药阔、 注意發(fā)送消息中的數(shù)據(jù)起始地址的高低字節(jié)顛到和接收消息中數(shù)據(jù)區(qū)的高低字節(jié)顛到冲驶;
2、 定時(shí)器事件在操作系統(tǒng)繁忙時(shí)容易被中斷執(zhí)行译教,可以適當(dāng)提高進(jìn)程和線程的優(yōu)先級來保證數(shù)據(jù)的更新速率杖扫,在Form_Load()中添加以下代碼:
Dim hThread As Long, hProcess As Long
hThread = GetCurrentThread
hProcess = GetCurrentProcess
SetThreadPriority hThread, THREAD_PRIORITY_HIGHEST
SetPriorityClass hProcess, HIGH_PRIORITY_CLASS
在Module1中添加以下聲明:
Public Const THREAD_BASE_PRIORITY_IDLE = -15
Public Const THREAD_BASE_PRIORITY_LOWRT = 15
Public Const THREAD_BASE_PRIORITY_MIN = -2
Public Const THREAD_BASE_PRIORITY_MAX = 2
Public Const THREAD_PRIORITY_LOWEST = THREAD_BASE_PRIORITY_MIN
Public Const THREAD_PRIORITY_HIGHEST = THREAD_BASE_PRIORITY_MAX
Public Const THREAD_PRIORITY_BELOW_NORMAL = (THREAD_PRIORITY_LOWEST + 1)
Public Const THREAD_PRIORITY_ABOVE_NORMAL = (THREAD_PRIORITY_HIGHEST - 1)
Public Const THREAD_PRIORITY_IDLE = THREAD_BASE_PRIORITY_IDLE
Public Const THREAD_PRIORITY_NORMAL = 0
Public Const THREAD_PRIORITY_TIME_CRITICAL = THREAD_BASE_PRIORITY_LOWRT
Public Const HIGH_PRIORITY_CLASS = &H80
Public Const IDLE_PRIORITY_CLASS = &H40
Public Const NORMAL_PRIORITY_CLASS = &H20
Public Const REALTIME_PRIORITY_CLASS = &H100
Public Declare Function SetThreadPriority Lib "kernel32" (ByVal hThread As Long, ByVal nPriority As Long) As Long
Public Declare Function SetPriorityClass Lib "kernel32" (ByVal hProcess As Long, ByVal dwPriorityClass As Long) As Long
3、 無論是讀取數(shù)據(jù)還是寫數(shù)據(jù)拖揩,發(fā)送和接收消息函數(shù)必須成對出現(xiàn)煎喘;
4、 在實(shí)際的通訊中如果網(wǎng)絡(luò)中斷(譬如交換機(jī)斷電丽示,插拔網(wǎng)絡(luò)插頭)將會導(dǎo)致發(fā)送和接收消息函數(shù)出錯(cuò)卫漫,其返回值sRet大于等于10000(網(wǎng)絡(luò)錯(cuò)誤),此時(shí)需要主動(dòng)發(fā)出NETLINK復(fù)位消息肾砂;發(fā)出復(fù)位消息后一般需要等待5秒鐘后再次進(jìn)行鏈接列赎;
5、 在每次嘗試NETLINK鏈接前為了避免找不到NETLINK導(dǎo)致的驅(qū)動(dòng)函數(shù)超時(shí)返回镐确,可以先采用NetIdent協(xié)議(參考Ni_pie.pdf文件包吝,使用Winsock控件)廣播網(wǎng)絡(luò)上的NETLINK,找到NETLINK后再嘗試鏈接辫塌,這樣可以提高通訊效率漏策;
6、 一次讀取地址連續(xù)的數(shù)據(jù)包(不要超過240個(gè)字節(jié))比多次讀取單個(gè)數(shù)據(jù)的效率要高的多臼氨;
7掺喻、 發(fā)送和返回的響應(yīng)消息的消息號Nr是對應(yīng)的,可以用Nr來判斷多個(gè)讀寫任務(wù)的響應(yīng)消息储矩;
8感耙、 如果一臺計(jì)算機(jī)需要同時(shí)訪問多個(gè)NETLINK通訊,建議采用VC++6.0開發(fā)持隧,采用多線程技術(shù)即硼;
七、聯(lián)系我們
無錫市北辰自動(dòng)化技術(shù)有限公司
江蘇省滴翠路100號無錫市國家工業(yè)設(shè)計(jì)園創(chuàng)意園A幢903
電話:0510-85166823腕浴,85162669圣谴,聯(lián)系人:王海波,張鵬
傳真:0510-85166813
Email:〓叕乁0弐児〓阅六,網(wǎng)址:〓叕乁1弐児〓
聲明:本網(wǎng)站所收集的部分公開資料來源于互聯(lián)網(wǎng)母赶,轉(zhuǎn)載的目的在于傳遞更多信息及用于網(wǎng)絡(luò)分享漂熙,并不代表本站贊同其觀點(diǎn)和對其真實(shí)性負(fù)責(zé),也不構(gòu)成任何其他建議万杉。本站部分作品是由網(wǎng)友自主投稿和發(fā)布袖况、編輯整理上傳,對此類作品本站僅提供交流平臺奸冶,不為其版權(quán)負(fù)責(zé)抢驴。如果您發(fā)現(xiàn)網(wǎng)站上所用視頻、圖片卢历、文字如涉及作品版權(quán)問題做身,請第一時(shí)間告知,我們將根據(jù)您提供的證明材料確認(rèn)版權(quán)并按國家標(biāo)準(zhǔn)支付稿酬或立即刪除內(nèi)容砸捏,以保證您的權(quán)益谬运!聯(lián)系電話:010-58612588 或 Email:editor@mmsonline.com.cn。
- 暫無反饋
編輯推薦
- 2025新年特刊:打造新質(zhì)生產(chǎn)力,智啟未來新篇章
- 定義制造業(yè)未來的數(shù)控加工中心技術(shù)專題
- 航空航天及交通領(lǐng)域先進(jìn)制造技術(shù)應(yīng)用專題
- 解碼消費(fèi)電子產(chǎn)品生產(chǎn)的數(shù)字化之路技術(shù)專題
- 精密智能機(jī)床山椎,助力制造升級技術(shù)專題
- 汽車輕量化驅(qū)動(dòng)下的零部件加工應(yīng)用專題
- 高性能銑刀實(shí)現(xiàn)高精加工生產(chǎn)技術(shù)專題
- 航空航天發(fā)動(dòng)機(jī)解決方案專題
- 高效齒輪加工生產(chǎn)技術(shù)方案專題
- 金屬加工液的性能不止?jié)櫥夹g(shù)應(yīng)用專題