ASCII သို့မဟုတ် RTU Mode ထဲက မည်သည့် Modbus Data ဘောင်တိုင်းမဆို သူတို့သတ်မှတ်ထားတဲ့ Data ကတော့ရှိပါတယ်။
Modbus Data Frame တစ်ခုစီကို 8bitd(RTU) တွေနဲ့တည်ဆောက်ထားတာကြောင့် အများအားဖြင့် စာသားတစ်ခုချင်းစီကို Bytes (Hexadecimal တစ်လုံး နှစ်လုံး) အဖြစ်ကိုယ်စားပြုပါတယ်။
ဥပမာအားဖြင့် 1100100101011011 ကဲ့သို့ Modbus Data နဲ့ 16-Bit စကားလုံးကို ပုံမှန်အားဖြင့် C95B နဲ့သတ်မှတ်ပြီး High ကို C9 နဲ့ Low ကို 5B ဆိုပြီးခွဲထားပါတယ်။
Modbus Master Device ကနေပေးပို့တဲ့ "Query" Message ဟာ Slave Device ဆီကို ပို့ပြီး သက်ဆိုင်ရာ "Response" Message နဲ့ Queried ကနေ Master Device ကိုပြန်ပို့ပေးပြီးအလုပ်လုပ်ပါတယ်။
အောက်ကပြထားတဲ့ ပုံတစ်ပုံချင်းစီကနေ Function Code တစ်ခုချင်းစီဘယ်လိုအလုပ်လုပ်ရသလဲဆိုတာပြန်ရေးပေးထားပါတယ်။
Modbus Function Code 01- Read Coil
==============================
ဒီ Modbus Function ဟာ Slave Device နဲ့အတူသူ့ရဲ့ Discrete Outputs ("Coils") ကို ဖတ်ပြီးတော့ အဲ့ဒီ Status တွေကို Data နဲ့ပြန်ပေးပါတယ်။
ဒီ Function အတွက်သတ်မှတ်ထားတဲ့ Modbus Address ရဲ့ Range ကတော့ 00001 ကနေ 09999 (Decimal) အထိဖြစ်ပါတယ်။ သို့သော် Starting Address ကတော့ Hexadecimal နဲ့ဖော်ပြထားတာဖြစ်ပြီး Range ရဲ့အစကနေ (n-1)^ th Register နဲ့ဖော်ပြပါတယ်။
ဥပမာပြောရရင် ပကတိ Decimal Address 00100 ကို Hexadecimal 0x0063 နဲ့ သတ်မှတ်ထားပါတယ်။ High-Order Byte ကို 63 နဲ့ သတ်မှတ်ထားပါတယ်။
ပုံထဲမှာပြထားတဲ့အတိုင်း မီးခိုရောင်ဖျော့ဖျော့နဲ့ ခြယ်ထားတဲ့ အပိုင်းဖြစ်တဲ့ ဒုတိယအပိုင်းနဲ့ တတိယအပိုင်းကတော့ Coil Status ကို ကိုယ်စားပြုပါတယ်။ ဘာကြောင့်လဲဆိုရင် သူတို့ရဲ့တည်ရှိမှုဟာ One Byte ကျော်တန်ဖိုးရှိတဲ့ Coil များကိုတောင်းဆိုထားတယ်လို့ ယူဆထားသော်ကြောင့်ဖြစ်ပါတယ်။
Modbus Function Code 02 - Read Contact
==================================
ဒီ Modbus Function ဟာ Slave Device နဲ့အတူ သူရဲ့ Discrete Inputs ("Contacts") ကိုဖတ်ပြီးတော့ အဲ့ဒီ Status တွေကို Data နဲ့ ပြန်ပေးပါတယ်။
ဒီ Function အတွက်သတ်မှတ်ထားတဲ့ Modbus Address ရဲ့ Range ကတော့ 10001 ကနေ 19999 (Decimal) အထိဖြစ်ပါတယ်။ သို့သော် Starting Address ကတော့ Hexadecimal နဲ့ဖော်ပြတာဖြစ်ပြီး Range ရဲ့အစကနေ (n-1)^ th Register နဲ့ဖော်ပြပါတယ်။
ဥပမာနဲ့ပြောပြရရင် ပကတိ Decimal Address "10256" ကို Hexadecimal "0x00FF" နဲ့သတ်မှတ်ထားပါတယ်။ High-Order Byte ကို "00" နဲ့ Low-Order Byte ကို "FF" နဲ့ သတ်မှတ်ထားပါတယ်။
Modbus Function Code 03 - Read Holding Register
======================================
ဒီ Function ကတော့ Slave Device နဲ့အတူ သူ့ရဲ့ "Holding" Register ရဲ့ Status ကို ယူဖတ်ပါတယ်။ ဒီနေရာမှာ Register တစ်ခုချင်းရဲ့ Size ဟာ Two Bytes (16 Bits) ရှိတယ်လို့ ယူဆနိုင်ပါတယ်။
ဒီ Function အတွက်သတ်မှတ်ထားတဲ့ Modbus Address ရဲ့ Range ကတော့ 40001 ကနေ 49999 (Decimal) အထိဖြစ်ပါတယ်။ အလားတူပဲ Starting Address ကတော့ Hexadecimal နဲ့ဖော်ပြတာဖြစ်ပြီး Range ရဲ့ အစကနေ (n-1)^ th Register နဲ့ဖော်ပြပါတယ်။
ဥပမာနဲ့ပြောရရင် ပကတိ Decimal Address "40980" ကို Hexadecimal "0x03D3" နဲ့သတ်မှတ်ထားပါတယ်။ High-Order Byte ကို "03" နဲ့ Low-Order Byte ကို "D3" နဲ့သတ်မှတ်ထားပါတယ်။
ဒီနေရာမှာ မှတ်ထားရမှာကတော့ Query Message တွေဟာ Register တွေရဲ့ နံပါတ်ကို သတ်မှတ်ထားတာကြောင့် Response Message တွေဟာလည်း Byte တွေရဲ့Number နဲ့ပဲ Reply လုပ်ပါတယ်။ Response Message ရဲ့ Number of Bytes Field ဟာ Query Message ရဲ့ Number of Registers Field ရဲ့တန်ဖိုး နှစ်ဆလောက်ရှိပါတယ်။
"Hi" နဲ့ "Lo" Byte တန်ဖိုးများဖြင့် Query Message (65536) တွင်တောင်းဆိုနိုင်တဲ့အများဆုံးအရေအတွက်ဟာ Response Message မှာရှိတဲ့ Single Byte တန်ဖိုး (255 Byte) ဖြင့်လည်း Report လုပ်နိုင်တာကိုလည်းမှတ်ထားရမှာဖြစ်ပါတယ်။
Reference: Instrumentationtools
Comments
Post a Comment