سؤال

جئت عبر وضع فضولي عند استخدام Jamod للكتابة إلى Modbus. بعد قراءة رمز يعمل تماما:

public static void main(String[] args) throws Exception {
   InetAddress address = InetAddress.getByName("host.somewhere");
   TCPMasterConnection connection = new TCPMasterConnection(address);
   connection.setPort(502);
   connection.connect();
   ReadMultipleRegistersRequest request = new ReadMultipleRegistersRequest(0, 1);
   ReadMultipleRegistersResponse response = (ReadMultipleRegistersResponse)
       executeTransaction(connection, request);
}

private static ModbusResponse executeTransaction(TCPMasterConnection connection,
         ModbusRequest request) 
         throws ModbusIOException, ModbusSlaveException, ModbusException {
   ModbusTCPTransaction transaction = new ModbusTCPTransaction(connection);
   transaction.setRequest(request);
   transaction.execute();
   return transaction.getResponse();
}

لكن محاولة كتابة طريقة مماثلة فشل (Jamod يحاول 3 مرات، كل المرات يواجه sockettimeoutException وأخيرا يلقي modbusexception).

public static void main(String[] args) throws Exception {
    final InetAddress address = InetAddress.getByName("host.somewhere");
    final TCPMasterConnection connection = new TCPMasterConnection(address);
    connection.setPort(502);
    connection.connect();
    Register reg = new SimpleRegister(0);
    WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
        new Register[]{reg});
    executeTransaction(connection, request);
}

نعم، أعرف أنني أستخدم إصدارات متعددة التسجيل من كائنات الطلب، ولكن الجهاز الذي أعمل به يدعم فقط رموز الوظائف 3 و 16.

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

هل لدى أي شخص تجربة أي شخص في استخدام Jamod وسيكون ذلك لطيفا بما يكفي لإخبار ما أفعله خطأ؟ يحدث هذا مع إصدارات 1.1 و 1.2RC1 من Jamod. أو هل هذا ربما بعض الوضع المحدد للبائع؟

هل كانت مفيدة؟

المحلول

في النهاية كتبت تطبيق Modbus الخاص بي. أنا بحاجة فقط لدعم 2 رموز وظيفة مختلفة، لذلك كان التنفيذ بسيطا.

على الرغم من أنني وجدت لاحقا مكتبة Modbus مفتوحة مفتوحة في Java. أنا شخص آخر يأتي عبر نفس المشكلة باستخدام modbus4j. قد تساعد.

نصائح أخرى

طلبات modbus لديها معرف وحدة = 0 افتراضيا. لذلك يجب تعيين أي معرف آخر لطلبه، على سبيل المثال:

WriteCoilRequest writeCoilRequest = new WriteCoilRequest(ref, bool);
writeCoilRequest.setUnitID(unitid);

يضيع بضع ساعات في محاولة حل نفس المشكلة التي وصفتها في السؤال.

طريقة بلدي التي كتبتها بناء على سؤالك يعمل!

try {
            ModbusTCPTransaction trans = null; // the transaction

            String refe = "0";// HEX Address
            int ref = Integer.parseInt(refe, 16);// Hex to int
            // int count = 1; // the number Address to read

            ReadMultipleRegistersRequest ainReq = new ReadMultipleRegistersRequest(
                    ref, count);
            ReadMultipleRegistersResponse ainRes = new ReadMultipleRegistersResponse();

            // 3. Start Transaction
            trans = new ModbusTCPTransaction(con);
            trans.setRetries(5);
            trans.setReconnecting(true);
            trans.setRequest(ainReq);

            int k = 0;
            do {
                trans.execute();
                ainRes = (ReadMultipleRegistersResponse) trans.getResponse();
                Register reg = new SimpleRegister(ertekInt);
                WriteMultipleRegistersRequest request = new WriteMultipleRegistersRequest(0,
                        new Register[]{reg});
                System.out.println("Állított AOUT:  " + request.getRegisterValue(k));
                lista.add(createPlanet("AOUT",
                        "" + k + "    " + request.getRegisterValue(k)));
                k++;
            } while (k < count);
} catch (ModbusIOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusSlaveException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ModbusException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

كان لدي مشكلة مماثلة، كنت أحاول كتابة قيمة في سجل تم تعريفه في "وظيفة الجهاز" كمسافة لفائف. لذلك اعتدت:

WriteCoilRequest coil_req = new WriteCoilRequest(registerReference,value2write)

وحدت هذه المشكلة. ربما هذه المساعدة.

وداعا!

لقد واجهت هذه المشكلة على Android.

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

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top