فقط حول NModbus (RTU)

هذه المقالة مخصصة للمبتدئين.

نظرية


Modbus هو بروتوكول اتصال يعتمد على بنية السيد والعبد. يستخدم واجهات RS-485 و RS-422 و RS-232 ، وكذلك شبكات إيثرنت TCP / IP لنقل البيانات.

NModbus هي مكتبة C # كبيرة تتضمن تنفيذ جميع أوضاع تشغيل البروتوكول. يسمح لك نموذج تنفيذ فئات هذه المكتبة بالعمل مع أي جهاز Modbus ، ولكن مع جهاز واحد فقط ، لأن فئات المكتبة تغلف المنفذ في حد ذاته ، مما يمنع المزامنة بين العديد من كائنات Modbus. هذا البروتوكول شائع جدًا عند تطوير الأجهزة الطرفية المختلفة للمنزل الذكي ، بالإضافة إلى إنترنت الأشياء.

فرق
, , TCP/IP .

لذا ، من أجل إدارة شيء ما ، نحتاج إلى معرفة ماذا وأين نرسل. لذلك نحن بحاجة إلى بطاقة تسجيل.

سأوضح أن خلايا التسجيل هي:
1. للقراءة فقط
2. القراءة والكتابة
3. الكتابة فقط (تأكيد التسجيل مسموح بإعطاء رمز خطأ)

أبسط بطاقة تبدو مثل هذا:
لقطة شاشة


أيضًا ، هناك تفسيرات مختلفة ، على سبيل المثال ، حول القيمة القصوى / الدنيا التي يمكن إرسالها إلى العنوان ، إلخ.

ممارسة


أستخدم الإصدار التجريبي من المحاكي من أدوات Modbus ومنافذ COM من MOXA مع واجهة RS-485.

منفذ COM


بمجرد إنشاء المشروع ، تحتاج إلى دمج NModbus فيه. أوصي باستخدام VisualStudio ، لأنه من السهل جدًا القيام بذلك مع NuGet ، كما هو موضح أدناه:

الخطوة الأولى


الخطوة الثانية


نحتاج في ModbusTools إلى تعيين معلمات الاتصال (قد تختلف بالنسبة لك ، وهي مناسبة لمنافذ COM الخاصة بي):

المعلمات مفتوحة على F3 ، أو في علامة التبويب "اتصال".

بالنسبة إلى Master و Slave ، يجب أن تتطابق الإعدادات ، باستثناء العنصر الذي يحتوي على منافذ COM.

لقطة شاشة


بعد الإعداد ، يمكنك النقر فوق "موافق" وستتصل الأجهزة ببعضها البعض. إما أن هذا لا يحدث ويظهر نقش أنه تم قطع الاتصال لمدة N ثانية ، أو أنه غائب تمامًا. في هذه الحالة ، تحقق من الإعدادات والاتصال ، وتأكد من تثبيت برامج تشغيل منافذ COM بشكل صحيح وتعمل بشكل صحيح.

مثال برنامج بسيط
using Modbus.Device;
using System;
using System.Collections.Generic;
using System.IO.Ports;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Modbus
{
    class Program
    {
        static void Main(string[] args)
        {
            SerialPort serialPort = new SerialPort(); //Create a new SerialPort object.
            serialPort.PortName = "COM1";
            serialPort.BaudRate = 9600;
            serialPort.DataBits = 8;
            serialPort.Parity = Parity.None;
            serialPort.StopBits = StopBits.One;
            serialPort.Open();
            ModbusSerialMaster master = ModbusSerialMaster.CreateRtu(serialPort);

            byte slaveID = 1;
            ushort startAddress = 0;
            ushort numOfPoints = 1;
            ushort[] holding_register = master.ReadHoldingRegisters(slaveID, startAddress,
            numOfPoints);
            Console.WriteLine(holding_register);
            Console.ReadKey();
        }
    }
}


لقطة شاشة


هام: إذا كنت تقوم بتطوير شيء أكثر تعقيدًا من المثال أعلاه ، يجب عليك التأكد من عدم فقدان الحزم. هناك حاجة لحساب المجموع الاختباري ، يمكنك القراءة عنه هنا.

Source: https://habr.com/ru/post/undefined/


All Articles