先自我介紹一下,96年初中畢業(yè)進(jìn)入制糖企業(yè)當(dāng)電工,04年春由于單位效益不好決定不干了,于是南下在鄭州學(xué)習(xí)計(jì)算機(jī)網(wǎng)絡(luò)工程師,以第一名成績結(jié)業(yè)。之后的一年多沒有從事電氣方面工作,也都不是長期穩(wěn)定的工作,06年下半年接觸plc編程,07年開始獨(dú)立進(jìn)行電氣設(shè)計(jì),10年10月自己開公司。
從去年12月份到現(xiàn)在一直在做一個(gè)能源管理及設(shè)備監(jiān)控的項(xiàng)目,項(xiàng)目簡介:工廠內(nèi)所有用電量,壓縮空氣,水,這三種能源的消耗,已經(jīng)做好的十二臺由西門子200plc控制的空調(diào)監(jiān)視,已經(jīng)做好的冷凍水,冷卻水,生產(chǎn)水,生活水等水循環(huán)系統(tǒng)內(nèi)的水泵變頻器的電參數(shù)監(jiān)視,今天要講的故事就是這一塊。再說一下還沒開始做的電能管理,所有電量表(有許多塊,具體數(shù)量還沒計(jì)算)都是已經(jīng)安裝好,并可以在上位機(jī)監(jiān)控的系統(tǒng),電量表和上位機(jī)都是北京愛博精電做的。所有的電量表都支持modbus通信,但是是通過串口服務(wù)器用以太網(wǎng)與上位機(jī)通信的。而我的系統(tǒng)內(nèi)是s7 315 2pn,這就要求我用315用以太網(wǎng)讀取電量表modbus通信下的各項(xiàng)參數(shù)了,若7號之前完成通信,再寫篇關(guān)于此方面的文章。工程中除電纜橋及電纜的鋪設(shè)是我指導(dǎo)安裝,其它都是我獨(dú)自完成,包括柜子配線,電氣原理圖設(shè)計(jì),plc編程,調(diào)試。
最近連續(xù)工作的好多天,每晚加班到八九點(diǎn),昨天給客戶的串口服務(wù)器柜子重新改造一下,是將7處新增加的電能表通過光纖轉(zhuǎn)485連接到串口服務(wù)器,恢復(fù)客戶原有的通信時(shí),晚上八點(diǎn)了,累壞了,所以今天休息,剛剛我的奶奶給我打電話祝我生日快樂,我都把自己生日給忘了。
下面正題:
簡介:客戶要求對變頻器的數(shù)據(jù)只監(jiān)不控??蛻羲械乃米冾l器都是丹弗斯vlt hvac暖通空調(diào)系列變頻器,功率有大有小,共有29臺,但由于modbus通信上還有4臺冷水機(jī)組,1個(gè)冷凍水加藥站,這樣從站超過了32臺,怕通信不會成功,及其它方面原因,所以在設(shè)計(jì)之初就采用2臺224分開來進(jìn)行通信,一臺帶23臺變頻器及加藥站,一臺帶6臺變頻器及4臺冷水機(jī)組,每臺224再掛以太網(wǎng)模塊與上位機(jī)wincc通信。從200的micro 'n powerv1.3幫助上知道200的通信口通信距離為50米,所以設(shè)計(jì)之初就提料買了2臺西門子485中繼器,這樣實(shí)際電氣隔離。以前在網(wǎng)上看到過文章,多臺200通過通信口通信,沒使用電氣隔離造成200全部損壞,具體原因就不得而知了
實(shí)施過程:
1、由于以前沒有modbus通信經(jīng)驗(yàn),所以過程是非常的艱難。由于我一直用筆記本,沒有串口,怕調(diào)試時(shí)出現(xiàn)麻煩事,所以買了摩莎的uport-1250i usb轉(zhuǎn)雙串口,第一次買回來新的啊,指示燈就不好用,又換了一次。在現(xiàn)場把兩個(gè)串口連起來,使用modscan32調(diào)試工具模擬modbus通信,通信成功,這樣有了一個(gè)大致的概念。
2、與現(xiàn)場抄表人員溝通(他們公司規(guī)定變頻器的運(yùn)行數(shù)據(jù)進(jìn)行抄錄),確定讀取變頻器的6個(gè)數(shù)據(jù),如下:
參數(shù)編號 名稱 單位 轉(zhuǎn)換指數(shù) 數(shù)據(jù)類型
1501 運(yùn)轉(zhuǎn)時(shí)間 0 h 74 uint32
1502 千瓦時(shí)計(jì)數(shù)器 0 kwh 75 uint32
1610 功率 [kw] 0.00 kw 1 int32
1613 頻率 0.0 hz -1 uint16
1614 電動機(jī)電流 0.00 a -2 int32
讀取變頻器的運(yùn)行狀態(tài)
線圈 0 1
33 控制未就緒 控制就緒
34 變頻器 未就緒 變頻器 就緒
35 慣性停止 安全功能關(guān)閉
36 無報(bào)警 報(bào)警
37 未使用 未使用
38 未使用 未使用
39 未使用 未使用
40 無警告 警告
41 不在參考值下 在參考值下
42 手動模式 自動模式
43 超出頻率范圍 在頻率范圍內(nèi)
44 已停止 運(yùn)行
45 未使用 未使用
46 無電壓警告 電壓警告
47 不在電流極限內(nèi) 電流極限
48 無熱警告 熱警告
高低字節(jié)互換后,由高到低對應(yīng)線圈為48----33
關(guān)于丹弗斯modbus通信時(shí)寄存器地址上的問題。
通過在網(wǎng)上搜索,丹弗斯變頻在modbus通信時(shí),寄存時(shí)的地址要功能號乘以10減1。如,變頻器的頻率地址為1613就是1613乘以10減1等16129 當(dāng)然這也造成了我后面的麻煩。這里假設(shè)你還不知道西門子200讀取時(shí)是只乘以10不用減1,這也坑了我一下。
想著先用modscan32調(diào)試工具讀取單臺變頻器試試吧,發(fā)現(xiàn)modscan32不支持《1613乘以10減1》這么大的地址,這怎么辦?在網(wǎng)上找啊找,找到一個(gè)《crc16自動計(jì)算軟件_modbus》軟件,通過計(jì)算出要發(fā)送的數(shù)據(jù)包,通過串口調(diào)試軟件發(fā)給變頻器,經(jīng)過幾次調(diào)試,通過轉(zhuǎn)換回傳回來的數(shù)據(jù),發(fā)現(xiàn)可以通過計(jì)算機(jī)串口與變頻器通信了。這時(shí)用的速率是變頻器最高的115200。
下面就開始在單臺plc編程讀取變頻器頻率。
modbus的mbus_msg指令的addr填寫16129,發(fā)現(xiàn)無法通信,仔細(xì)看那個(gè)網(wǎng)上的文檔才發(fā)現(xiàn)200不需要減1,于是改成16130,發(fā)現(xiàn)還是無法讀取,這是什么原因?又開始看各種資料。最后在micro 'n powerv1.3里找到,《modbus master 協(xié)議庫支持超過 9999 的保持寄存器地址。地址范圍為 400001 - 465536》,這樣16130肯定是超過9999了,改成416130后,可以通信了。
問題又來了。
這樣變頻器寄存器的地址就變成了運(yùn)轉(zhuǎn)時(shí)間415010 千瓦時(shí)計(jì)數(shù)器415020 功率 416100,本來寄存器地址就不連續(xù),讀起來不方便,這回更是拆成了6個(gè)。唉,先編程再說吧。先編的是23臺變頻器224,編著編著發(fā)現(xiàn)編譯保存時(shí),輸出窗口出現(xiàn)一個(gè)警告,說程序太大14000多字節(jié),不適合224,當(dāng)時(shí)就哭了。想想也是23臺變頻器,每臺6條指令,再加上數(shù)值的處理,程序量很可觀啊,怎么辦,首先想到的是換226,付款訂226,226在快遞中的時(shí)候。想到了西門子的指針,想著把變頻器的從站地址放入v區(qū),再用指針去讀取v區(qū)里的變頻器的從站地址,讀到地址23就返回到1,這樣就6條讀取指令,可大大減小程序塊??墒侵羔樜覐膩頉]用過啊,于是看指令方面的知識,看看發(fā)現(xiàn)從站地址是字節(jié)型,心想能不能每讀完一臺變頻器的數(shù)據(jù)后,從站地址加1,就是字節(jié)型加上,發(fā)現(xiàn)step-7-microwin沒有字節(jié)整數(shù)型運(yùn)算指令,無意中發(fā)現(xiàn)字節(jié)遞增指令inc_b,這樣就可實(shí)現(xiàn)每次地址加1。程序修改后大小為9400左右。
下載后進(jìn)行通信,使用的速率為115200,無法通信,又是什么原因?用計(jì)算機(jī)串口在rs485中繼器網(wǎng)絡(luò)2上檢測不到數(shù)據(jù),網(wǎng)絡(luò)1連接的plc,網(wǎng)絡(luò)1上有數(shù)據(jù)。一共兩個(gè)中繼器,互換一下看看吧,還是不好用。說一個(gè)這兩個(gè)中繼器,一個(gè)是朋友的工程余貨,一個(gè)是在淘寶上淘的二手(這里可以鄙視我一下)。兩個(gè)中繼器的接線,開關(guān)位置都沒問題,就是通信不上,原因還是待查。大膽的將cpu通信直接連入網(wǎng)絡(luò)2,發(fā)現(xiàn)plc指令還是顯示從站無響應(yīng),因?yàn)榇藭r(shí)速率還是115200,全部改成9600試試吧,改成后全部都可以讀取啦。非常高興的說。現(xiàn)在速率運(yùn)行在38400的速度上,輪詢23臺變頻的總時(shí)間在8秒左右,只監(jiān)不控可以了。
話說這樣就結(jié)束了嗎,還沒有??梢钥瓷厦孀冾l出來的數(shù)據(jù)不適合上位機(jī)監(jiān)視,所以要經(jīng)過數(shù)據(jù)轉(zhuǎn)換。我程序的形式是每次讀取一臺變頻器的數(shù)據(jù)傳出,再進(jìn)行整體的數(shù)據(jù)轉(zhuǎn)換,發(fā)現(xiàn)每次從地址23再地址1時(shí)全部變頻的數(shù)據(jù)會向后串一臺變頻器,就是地址1的數(shù)據(jù)是地址23的,只是一個(gè)周期。心里這應(yīng)該是程序中有些指令是多周期的導(dǎo)致數(shù)據(jù)還沒轉(zhuǎn)換完就讀取下一臺的數(shù)據(jù)了。接著改程序,改成每次讀取的數(shù)據(jù)傳出,再用sm0.0啟用數(shù)據(jù)轉(zhuǎn)換。不再有上述現(xiàn)象。
還沒結(jié)束,發(fā)現(xiàn)轉(zhuǎn)換后變頻器的頻率不正確,而從轉(zhuǎn)換前的數(shù)據(jù)是正確的??梢钥醋冾l器的頻率數(shù)據(jù)是uint16,要變成浮點(diǎn)數(shù)才可以。原程序是將uint16格式的vw傳出到vw,發(fā)現(xiàn)傳出后的vw里的數(shù)值就和前面的不一樣的,這個(gè)真的不知道為什么了,還請高手解答一下。如何解決的呢,我不再把數(shù)值傳出,傳送指令前要加根據(jù)從站地址接通的上升沿,我直接將uint16格式轉(zhuǎn)換成雙整數(shù)di,再轉(zhuǎn)換成浮點(diǎn)數(shù),再用浮點(diǎn)數(shù)乘以0.1,最后成功得到頻率。
最后對整個(gè)程序進(jìn)行整理,大功告成。