一. 檔案列表 RS485.pdf電路圖RS485.CC的原始程式RS485.asm由C轉成的組合語言檔RS485.hex燒錄檔二. MODBUS介紹 MODBUS通訊協定原本是MODICON公司為自己所生產的PLC(可程式邏輯控制器)所開發的通訊協定,後來廣泛為工業界所使用,它是一對多的方式來通訊,目前他是採開放的方式不需支付任何費用,任何人皆可開發,所以目前許多PLC、人機介面及圖控軟體都有支援。 目前modbus通訊協定可分為Modbus ASCII及Modbus RTU兩種傳送方式,Modbus ASCII顧名思義就是以ASCII碼的方式來傳輸,而Modbus RTU是以Binary的方式來傳輸,二者以RTU的方式最快,所以我介紹RTU的方式,它傳送資料是從低位元開始傳送,下面的表格是Modbus通訊協定的功能表,其中384、484、584、884、M84及984為Modicon公司所生產的PLC型號。 CodeName384484584884M8498401Read Coil StatusYYYYYY02Read Input StatusYYYYYY03Read Holding RegistersYYYYYY04Read Input RegistersYYYYYY05Force Single CoilYYYYYY06Preset Single RegisterYYYYYY07Read Exception StatusYYYYYY08Diagnostics(see Modicon Modbus Protocol Reference Guide Chapter 3)09Program 484NYNNNN10Poll 484NYNNNN11Fetch Comm. EventCtr.YNYNN12FetchComm. EventLogYNYNN13Program ControllerYNYNNY14Poll ControllerYNYNNY15Force Multiple CoilsYYYYYY16Preset Multiple RegistersYYYYYY17Report SlaveIDYYYYY18Program 884/M84NNNYYN19Reset Comm. LinkNNNYYN20Read General ReferenceNNYNNY21Write General ReferenceNNYNNY22Mask Write 4X RegisterNNNNN(1)23Read/Write 4X RegistersNNNNN(1)24Read FIFO QueueNNNNN(1)Notes: ( 1 ) Function is supported in 984–785 only. 此次的範例我們只用了Function 3(Read Holding Registers)及Function 6(Preset Single Register)的功能,所以以下針對這兩個Function做一說明 Function 03(Read Holding Registers) 讀取Slave Holding Registers的內容(二進制碼)從PLC 4X的參考位置,我以範例來說明 QUERY Example
Field Name (Hex) -------------------------------- Slave Address 11 Function 03 Starting Address Hi 00 Starting Address Lo 6B No. of Points Hi 00 No. of Points Lo 03 Error Check (LRC or CRC) ––
Slave Address從0-7E(Hex),Function code為03,讀取暫存器的起始位置從40108-40110,其中108為6C,但因通訊的暫存器位置從0開始,所以108需減一,也就是6B,108-110總共三個暫存器(No. of Points),Error Check有分LRC及CRC,LRC為Modbus ASCII Mode的錯誤檢查碼,RTU Mode使用的是CRC的檢查方式,CRC的檢查方式在程式說明的章節再說明。 织梦内容管理系统
RESPONSE Example
Field Name (Hex) -------------------------------- Slave Address 11 Function 03 Byte Count 06 Data Hi (Register 40108) 02 Data Lo (Register 40108) 2B Data Hi (Register 40109) 00 Data Lo (Register 40109) 00 Data Hi (Register 40110) 00 Data Lo (Register 40110) 64 Error Check (LRC or CRC) ––
此回應是從Slave傳至Master,前頭的Address及Function都與Master傳過來的一樣,Byte Count為要回傳至Master的byte數,因為Master要求讀取3個暫存器的資料,一個暫存器有兩個bytes,所以總共6個bytes,再來就是依次傳回40108-10110的內容,最後再CRC檢查碼。 Function 06(Preset Single Register) 將資料寫入Holding Register,且一次只寫入一個暫存器 QUERY Example
Field Name (Hex) -------------------------------- Slave Address 11 Function 06 Register Address Hi 00 Register Address Lo 01 Preset Data Hi 00 Preset Data Lo 03 Error Check (LRC or CRC) ––
將資料03寫入Slave Address 11暫存器40002的位置。 RESPONSE Example
Field Name (Hex) -------------------------------- Slave Address 11 Function 06 Register Address Hi 00 Register Address Lo 01 Preset Data Hi 00 Preset Data Lo 03 Error Check (LRC or CRC) ––