西門子s7-200的自由口通信需要通過編程設(shè)置串口的工作模式,安排發(fā)送和接受指令的觸發(fā)順序,還要設(shè)定接收的起始和結(jié)束條件。對于剛剛開始使用s7-200的電氣工程師來說,的確有很多細微處易犯錯誤。一般碰到客戶抱怨通信不上的問題,就要逐一幫客戶確認編程配置是否正確。雖然麻煩,不過逐條查下去,總能查到錯誤所在并解決問題。但是有一次客戶遇到的問題頗出人意料,還真耗費了一些時間。
客戶反應(yīng)在編寫了自由口通信程序之后,plc可以發(fā)送數(shù)據(jù)給通信伙伴,但是卻收不到任何伙伴方發(fā)出的數(shù)據(jù)。能發(fā)送數(shù)據(jù)給對方,說明通信端口設(shè)置沒有問題。極有可能是端口被其他通信指令占用導(dǎo)致無法進入接收狀態(tài)。比如說用常開點調(diào)用xmt,或者沒有對接收的故障狀態(tài)進行判斷并終止接收,從而導(dǎo)致后續(xù)的xmt和rcv都無法被正確執(zhí)行??蛻舯硎舅某绦虿⒉淮嬖谶@種情況。但是為了測試問題所在,客戶下載了一個僅包含條件觸發(fā)rcv的程序下去,還是接收不到數(shù)據(jù)。監(jiān)控程序rcv指令已被正常執(zhí)行。
那么是不是接收的起始條件設(shè)置不當(dāng)?客戶使用的是起始字符,這并無不妥。并且改成空閑線檢測之后,問題依然存在。難道是對方發(fā)送的信號有問題?用串口調(diào)試軟件來測試,是可以接收到的。眼見這幾個常見錯誤都沒能cover住這個問題,我只好從頭一步步地跟客戶確認。但是還是沒能發(fā)現(xiàn)任何破綻。郁悶之下,只好讓客戶把程序發(fā)過來看看。
第一次檢查程序的時候還真沒注意到問題出在哪里。等到看出來了才覺得啼笑皆非:
不知道大家看出來沒有?客戶在設(shè)定完空閑線時間smw90和消息定時器溢出值smw92后,慣性地將接受地最大字符數(shù)smb94也寫成了傳送字smw94。而西門子plc的高低字節(jié)是逆序的,也就是說smb94為高有效字節(jié),smb95為低有效字節(jié)。見手冊中的如下說明:
結(jié)果就是最大字符數(shù)100被傳給了smb95,smb95是神馬呢?神馬也不是,總之與接收條件無關(guān)。而真正最大字符數(shù)存儲字節(jié)smb94被賦值為0。最大字符數(shù)都為0了,那當(dāng)然是接收不到任何數(shù)據(jù)了。