Giter Club home page Giter Club logo

nodepccc's Introduction

nodePCCC

nodePCCC is a library that allows communication to certain Allen-Bradley PLCs - The SLC 500 series, Micrologix and ControlLogix/CompactLogix PLCs using PCCC embedded in Ethernet/IP. This is not an official implementation of Ethernet/IP. This is not affiliated with or supported by Allen-Bradley in any way. CompactLogix, ControlLogix, SLC 500, 1761-NET-ENI are trademarks of Allen-Bradley.

WARNING - This is BETA CODE and you need to be aware that WRONG VALUES could be written to WRONG LOCATIONS. Fully test everything you do. In situations where writing to a random area of memory within the PLC could cost you money, back up your data and test this really well. If this could injure someone or worse, consider other software.

To use this on a SLC, you must have a SLC 5/05 with Ser A FRN 5 or later, or Ser C FRN 3 or later. Earlier versions will not work. You may also use a 1761-NET-ENI module with a 5/03 and other processors supported by the ENI module. This may work using an ENI module connected to a CompactLogix, although this combination hasn't been tested either. It has been tested only on direct connection to newer SLC 5/05 CPUs, a 5/03 CPU with a 1761-NET-ENI module, a couple of CompactLogix and a much earlier version was tested on a ControlLogix. Try at your own risk with other combinations. Using this with a PLC5 will likely require a different DF1 command with different formatting. Consult the DF1 manual (google it) for more details. (The manual suggests reading is more likely to work than writing but we don't have access to a PLC-5 and can't test it.) In any case, PLC-5-specific commands could certainly be added.

If you are using with a ControlLogix and possibly some CompactLogix, you likely need to specify the {routing: [0x01,0x00,0x01,0x00]} option (meaning path length 1 (2 bytes), backplane port 1 of the ENBT module, slot 0 of the 1756 backplane). You can experiment with other paths to make requests from a SLC 5/04 over DH+, for example, but it may not work - we have not tried this.

On a CompactLogix or ControlLogix, you must go to the "Tools" menu in Logix 5000 and "Map PLC5/SLC messages" to map an array of values (only Float/Int/DINT have been tested) to a "file number" and then request that file number preferably with the corresponding type. So if you create a variable called THEINTEGER with type INT[10] then map it to file 7 and download, you can request N7:0 to get the first element, and so on.

Note that it is currently not possible to write to bits above 15 (most-significant word) in a long integer as the PCCC read-modify-write command appears to not support this. You must write the entire DINT or use bits within an INT.

It is optimized in two ways - it sorts a large number of items being requested from the PLC and decides what overall data areas to request. It does not yet group multiple small requests together in a single packet, which is apparently possible. It does, however, send 2 packets at once, for speed, and this number could potentially be increased. So a request for 100 different bits, all close (but not necessarily completely contiguous) will be grouped in one single request to the PLC, with no additional direction from the user. Its optimizations are not likely tuned as well as some commercial OPC servers, however.

nodePCCC manages reconnects for you. So if the connection is lost because the PLC is powered down or disconnected, you can continue to request data with no other action necessary. "Bad" values are returned, and eventually the connection will be automatically restored.

nodePCCC is written entirely in Javascript, so no compiler installation is necessary on Windows, and deployment on other platforms (ARM, etc) should be no problem.

This was developed using Wireshark to help with packet format. Allen Bradley's own documentation was helpful as well, such as the "DF1 manual".

To get started:

npm install nodepccc

Example usage:

var nodepccc = require('nodepccc');
var conn = new nodepccc;
var doneReading = false;
var doneWriting = false;

conn.initiateConnection({port: 44818, host: '192.168.8.106' /* , routing: [0x01,0x00,0x01,0x00] */}, connected);
// Either uncomment the routing or uncomment this next line for ControlLogix/CompactLogix or if otherwise using routing	
// First 0x01, 0x00 = 1 word in the path, second 0x01, 0x00 = Port 0x01 (backplane port of Ethernet module), 0x00 = PLC is in slot 0 in chassis.   

function connected(err) {
	if (typeof(err) !== "undefined") {
		// We have an error.  Maybe the PLC is not reachable.  
		console.log(err);
		process.exit();
	}
	conn.setTranslationCB(tagLookup);
	conn.addItems(['TEST1', 'TEST4']);
	conn.addItems('TEST1');
//	conn.removeItems(['TEST2', 'TEST3']);  // Demo of "removeItems".  
//	conn.writeItems(['TEST5', 'TEST6'], [ 867.5309, 9 ], valuesWritten);  // You can write an array of items like this if you want.  
	conn.writeItems('TEST7', [ 666, 777 ], valuesWritten);  // You can write a single array item too.  
	conn.readAllItems(valuesReady);	
}

function valuesReady(anythingBad, values) {
	if (anythingBad) { console.log("SOMETHING WENT WRONG READING VALUES!!!!"); }
	console.log(values);
// alternative syntax		console.log("Value is " + conn.findItem('TEST1').value + " quality is " + conn.findItem('TEST1').quality);
	doneReading = true;
	if (doneWriting) { process.exit(); }
}

function valuesWritten(anythingBad) {
	if (anythingBad) { console.log("SOMETHING WENT WRONG WRITING VALUES!!!!"); }
	console.log("Done writing.");
	doneWriting = true;
	if (doneReading) { process.exit(); }
}

// This is a very simple "tag lookup" callback function that would eventually be replaced with either a database findOne(), or a large array in memory.  
// Note that the return value is a controller absolute address and datatype specifier.  
// If you want to use absolute addresses only, you can do that too.  
function tagLookup(tag) {
	switch (tag) {
	case 'TEST1':
		return 'N7:0';				// Integer
	case 'TEST2':
		return 'B3:0/0';			// Bit
	case 'TEST3':
		return 'B3/17';				// Same as B3:1/1
	case 'TEST4':
		return 'F8:0,20';  			// Yes this is an array...  20 real numbers.  
	case 'TEST5':
		return 'F8:1';				// Single real.  
	case 'TEST6':
		return 'F8:2';				// Another single real.  
	case 'TEST7':
		return 'N7:1,2';			// A couple of integers in an array  	
	case 'TEST8':
		return 'O:5/1';				// Direct output  	
	case 'TEST9':
		return 'ST18:0';
	default:
		return undefined;
	}
}

This returns some diagnostic output as well as the following:

{ TEST1: 30724,
  TEST4: 
   [ 867530.875,
     1,
     97.0999984741211,
     2.9000000953674316,
     97,
     0,
     0,
     19,
     0,
     0,
     0,
     0,
     0,
     0,
     0,
     0,
     0,
     0,
     0,
     0 ] }

API

nodepccc.initiateConnection(params, callback)

Connects to a PLC.

params should be an object with the following keys:

  • port (normally specify 44818)
  • host (address)
  • routing (array of characters specifying path length, path, etc. Most common is [0x01, 0x00, 0x01, 0x00] for ControlLogix.)

callback(err) will be executed on success or failure. err is either an error object, or undefined on successful connection.

nodepccc.dropConnection(callback)

Disconnects from a PLC.

This simply terminates the TCP connection. It does NOT do an Ethernet/IP disconnect at this time. The callback is called upon completion of the TCP close.

nodepccc.setTranslationCB(translator)

Sets a callback for name - address translation.

This is optional - you can choose to use "addItem" etc with absolute addresses.

If you use it, translator should be a function that takes a string as an argument, and returns a string in the following format: <type specifier><file number - I assumed 1, O assumed 0, S assumed 2>:<element>[</bit> or </DN, /EN, /TT> or <.ACC, .PRE>],array length

Examples:

  • F8:30
  • F8:0,10 - array of 10 floating point numbers
  • N7:12
  • L9:1 - long integer is MicroLogix/ControlLogix/CompactLogix only
  • N7:12/1 - second bit in the word
  • B3:6/6
  • T4:6.ACC - timer accumulator - read/write
  • C5:1.PRE - counter preset - read/write
  • T4:0,20 - array of timers - will return an array of objects representing 20 timers - READ ONLY
  • R6:0.LEN - control length - read/write
  • R6:0 - control structure - will return a JS object - READ ONLY
  • ST18:0,2 - Array of strings
  • NST34:0 - String that has been copied with the COP instruction to an integer data type in a Control/CompactLogix PLC

Note that some values are not supported in an array - timer presets and accumulators are an example, but entire timers are fine for READ ONLY.

Note that strings are supported, but in Control/CompactLogix you must first COP the string to an integer that is mapped to a PLC5/SLC file. You can read and write from this and COP it back to a string as needed.

In the example above, an object is declared and the translator references that object. It could just as reference a file or database. In any case, it allows cleaner Javascript code to be written that refers to a name instead of an absolute address.

nodepccc.addItems(items)

Adds items to the internal read polling list.

items can be a string or an array of strings.

nodepccc.removeItems(items)

Removes items to the internal read polling list.

items can be a string or an array of strings.

nodepccc.writeItems(items, values)

Writes items to the PLC using the corresponding values.

items can be a string or an array of strings. If items is a single string, values should then be a single item (or an array if items is an array item). If items is an array of strings, values must be an array.

You should monitor the return value - if it is non-zero, the write will not be processed as there is already one it progress, and the callback will not be called.

nodepccc.readAllItems(callback)

Reads the internal polling list and calls callback when done.

callback(err, values) is called with two arguments - a boolean indicating if ANY of the items have "bad quality", and values, an object containing the values being read as keys and their value (from the PLC) as the value.

nodepccc.findItem(item)

Returns the item object being searched for (by iterating through the array of items), or undefined if it isn't found in the item list. This allows accessing item.value and item.quality.

nodepccc's People

Contributors

jledun avatar lucasrsv1 avatar plcpeople avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

nodepccc's Issues

Basics

Greetings! I've used libplctag in "C" but looking for a nodejs solution. I have ControlLogix, ENET in slot 0, L5583 in slot 1. For 'routing' I have 1,0,1,1 (0x01,0x00...), no 'Translation', pgm output:
.TCP Connection Established ... port 44818
.EIP ...connection confirmed
.Session Handle is 0xB000100
.Adding Test1 (which is DINT in PLC)
[419121,627394019] Error - String Couldn't Split Properly. For SLC Addressing it needs a : ..
[419121,627460735] Dropping an undefined...

Can not read string array

Trying to read string array and only get first 2 elements. Writes work perfectly. Can always read array of 2. Code below produces following:

Values read: { STRARRAY: [ 'String 00', 'String 01', '', '' ] }
[50475,547282909 10.0.0.101] Preparing to WRITE STR0,STR1,STR2,STR3,STR4
[50475,559641594] NST9:0 write completed with quality OK
[50475,559721341] NST9:1 write completed with quality OK
[50475,559756823] NST9:2 write completed with quality OK
[50475,559794130] NST9:3 write completed with quality OK
[50475,559815871] NST9:4 write completed with quality OK
Done writing.


function connected(err) {
if (typeof(err) !== "undefined") {
// We have an error. Maybe the PLC is not reachable.
console.log(err);
// process.exit();
}
conn.setTranslationCB(tagLookup);

conn.addItems('STRARRAY');

// conn.addItems(['INT0','INT1','INT2', 'INT2']);

    async.forever(
        function(next) {
            //conn.readAllItems(valuesReady);
            if (doneReading && doneWriting) {
            doneReading = false;
            conn.readAllItems(function (err, values) {
                if (err) {
                  console.log("SOMETHING WENT WRONG READING VALUES!!!!");
                  plc_error = true;
                } else {
                  console.log('Values read: ',values)
                  plc_error = false;
                  ++sheet_length;
                  conn.writeItems(['STR0', 'STR1', 'STR2', 'STR3', 'STR4'],
                                  ['String 00', 'String 01', 'String 02', 'String 03', 'String 04'], valuesWritten);

// conn.writeItems(['INT0', 'INT1', 'INT2'],
// [2, sheet_length, 500500], valuesWritten);
doneWriting = false;
}
doneReading = true;
setTimeout(function () {
next();
}, 1000);
// if (doneWriting) { process.exit(); }
});
}
},
function(err) {
console.log('READ LOOP ERROR: ' + err);
}
);
}

function valuesWritten(anythingBad) {
if (anythingBad) { console.log("SOMETHING WENT WRONG WRITING VALUES!!!!"); }
console.log("Done writing.");
doneWriting = true;
}

// This is a very simple "tag lookup" callback function that would eventually be replaced with either a database findOne(), or a large array in memory.
// Note that the return value is a controller absolute address and datatype specifier.
// If you want to use absolute addresses only, you can do that too.
function tagLookup(tag) {
switch (tag) {
case 'TEST1':
return 'Test_Int'; // Integer
case 'TEST2':
return 'B3:0/0'; // Bit
case 'TEST3':
return 'B3/17'; // Same as B3:1/1
case 'TEST4':
return 'F8:0,20'; // Yes this is an array... 20 real numbers.
case 'TEST5':
return 'F8:1'; // Single real.
case 'TEST6':
return 'F8:2'; // Another single real.
case 'TEST7':
return 'N7:1,2'; // A couple of integers in an array
case 'TEST8':
return 'NST9:2,4'; // Direct output
case 'TEST9':
return 'N7:0'; // Direct output
case 'STRARRAY':
return 'NST9:0,4'; // setup number
case 'STR0':
return 'NST9:0'; // setup number
case 'STR1':
return 'NST9:1'; // customer name
case 'STR2':
return 'NST9:2'; // order number
case 'STR3':
return 'NST9:3'; // next operation
case 'STR4':
return 'NST9:4'; // generic comment
case 'INT0':
return 'L7:0'; // discharge direction (flags?)
case 'INT1':
return 'L7:1'; // sheet width
case 'INT2':
return 'L7:2'; // sheet length
case 'INT3':
return 'L7:3'; // sheets in discharge
case 'INT4':
return 'L7:4'; // sheets in discharge
case 'INT5':
return 'L7:5'; // stacks to batch
default:
return undefined;
}
}

[Question]Write variable, not array

I have on 5000 bool variable mapped at 7.
I already tried address like this "B7:0","B7:0/0" and nothing write single bool.
If i changed bool to bool array "B7:0", "B7:1" works fine.

How to write single bool?

ControlLogix 5000 L62

Regards,
I have reviewed the code JS and I noticed that only make reference to the PLC SLC and SLC TAGS are written format.
I have a 5000 ControlLogix L62, as NodePCCC use the library. As it gives me error with the name of the TAGS.

Run logs:
[26342,640543399] Initiate Called - Connecting to PLC with address and parameters:
[26342,642161528] { port: 44818, host: '192.168.0.27', routing: [ 1, 0, 1, 0 ] }
[26342,645670629] Connection cleanup is happening
[26342,647648806 192.168.0.27] Attempting to connect to host...
[26342,650936363 192.168.0.27] TCP Connection Established to 192.168.0.27 on port 44818 - Will attempt EIP Connection
[26342,655129009 192.168.0.27] EIP Register Session Response Received - connection confirmed
[26342,655552538 192.168.0.27] Session Handle is 0x13023F00
[26342,655843654] Translation OK
[26342,656546115 192.168.0.27] Adding air_pressure
[26342,657363676] Error - String Couldn't Split Properly. For SLC Addressing it needs a : to be valid.
[26342,657497371] Dropping an undefined request item.
PS C:\node\nodepccc>

When polling at 100ms, eventually start getting 'Waiting to read for all R/W operations to complete. Will re-trigger readAllItems in 100ms.'

Do you guys have plans of implementing this with callbacks so that the application running the module can make sure not to call again until the previous has returned?

Using the async module and altering the example a bit with:

conn.addItems('TEST9');

    async.forever(
        function(next) {
            //conn.readAllItems(valuesReady);

            conn.readAllItems(function (err, values) {
                if (err) { console.log("SOMETHING WENT WRONG READING VALUES!!!!"); }
                console.log(values);
                doneReading = true;
                if (doneWriting) { process.exit(); }
            });

            setTimeout(function () {
                next();
            }, 100);
        },
        function(err) {
            console.log('ERROR: ' + err);
        }
    );

After a few seconds of running I continue to get this:

{ TEST9: 4 }
[17439,716142848] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[17439,716207848] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[17439,716244339] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[17439,716670828] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
{ TEST9: 16 }
[17439,817173683] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[17439,817237162] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[17439,817270232] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[17439,817303682] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
{ TEST9: 2 }

Remote connection

Does the project support an IP address in the connection path?

routing: [0x01,0x00,0x02,'10.44.9.149',0x01,0x00]

0x01 - backplane (local rack)
0x00 - 1756-ENBT slot 0 (local)
0x02 - ethernet module port
10.44.9.149 - to 1756-ENBT remote IP
0x01 - backplane (remote)
0x00 - 1756-Lxx slot 0 (remote)

Inconsistency of how optional routing header should be formed

Hi,

In the top section of the readme you state

If you are using with a ControlLogix and possibly some CompactLogix, you likely need to specify the {routing: [0x01,0x00,0x01,0x00]} option (meaning path length 1, backplane port 0 of the ENBT module, path length 1, slot 0 of the 1756 backplane).

But further down when you detail the API you state

conn.initiateConnection({port: 44818, host: '192.168.8.106' /* , routing: [0x01,0x00,0x01,0x00] */}, connected); // Either uncomment the routing or uncomment this next line for ControlLogix/CompactLogix or if otherwise using routing // First 0x01, 0x00 = 1 word in the path, second 0x01, 0x00 = Port 0x01 (backplane port of Ethernet module), 0x00 = PLC is in slot 0 in chassis.

So for the same routing input [0x01, 0x00, 0x01, 0x00] you initially state it will get you port 0 and slot 0, then in the second you state it will get you port 1 and slot 0.

Can you clarify which is correct interpretation of how the header should be formed please

Thanks,
Dominic

Mapping Values to PLC5/SLC Messages for CLX

I've been trying to test this functionality out with my CLX I have. I believe I setup the map correctly. It's simply a DINT to file number 7 and downloaded to the CLX. However when I try to read N7:0 from the CLX its coming back as Bad 255. Is there any other configuration needed that I'm missing here?

Connect to serial port?

Is it possible to connect this library to a PLC via the serial port instead of TCP? I have some Micrologix devices that don't have Ethernet ports, and some SLC devices that aren't near Ethernet connections - would be great if I could read/write via their serial ports. I believe this is DF1 protocol.

Thanks!

[Question!] Show 16 bits integer in an array (micrologix 1400)

Hello, first, thanks for this, I'm working on a HMI with NodeJS and this is perfect, my question is when i'm showing the data of the PLC, in the taglookup function I have this:

switch (tag) { case 'TEST': return 'N3:0/0,8'; }
this show the right values, but, when i change the function:
switch (tag) { case 'TEST': return 'N3:0/0,16'; }
this show bad and undefined values, also i tried with this:
switch (tag) { case 'TEST': return 'N3:0/8,8'; }
but the same result bad and undefined values. is there a way to call the 16 bits of an integer ?

Thank You

Try to read PD10:0.KC don't work

Hi,
When I try to read PD10:0.KC, it fails.
After checking the library, it appears to me that this PD memory is not supported.
It is correct?

Best Regards,

Can't Communicate

I am not able to communicate with Micro 820.
Cant understand data types.
Kindly Please Help.

[BUG] Overflow(?) with lost connection

I send lifeBit to PLC like this

   setInterval(() => {
                if (!this.handleLifeBit) {
                    conn.readAllItems((anythingBad, values) => {
                        var val = values[this.config.lifeBit.address];
                        val = val == 1 ? 0 : 1;

                        conn.writeItems(this.config.lifeBit.address,
                            [val], this.valuesWritten);
                    });

                }
            }, this.config.lifeBit.interval);

Read int, and write negated.

If I "cut off" ethernet, after some time,(I think overflow queue?) libary throws uncaught Exception.
Error:
TypeError: Cannot read property 'length' of undefined

Log:

[1343,227455893] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,328989652] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,431009174] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,532745026] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,634546421] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,736446207] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,837179769] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1343,937974933] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,39941167] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,141726236] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,229407891] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,244059955] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,329732601] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,345436256] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,431090838] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,445760237] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,532379732] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,547042155] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,632682681] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,648394458] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,734005361] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,749676168] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,835405610] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,851181524] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,936296112] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1344,951221660] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,37029087] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,53190726] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,138250324] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,153368022] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,229440609] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,239667824] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,255820821] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,331919593] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,342044617] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,357053979] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,433081223] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,443200155] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,458245647] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,534241498] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,544291973] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,558335588] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,634341956] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,645448449] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,659436048] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,736663097] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,747784427] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,761786082] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,838940561] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,851718515] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,898799574] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,941122674] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1345,953901424] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,551835] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,42258240] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,54921212] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,102567358] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,142198321] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,155824334] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,203453821] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,232127740] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,242759727] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,257423019] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,304062758] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,332761456] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,344376685] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,357995098] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,405567112] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,433200940] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,444811171] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,459454212] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,506073127] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,533804150] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,546419331] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,560073977] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,606757914] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,635438183] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,647068197] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,660715971] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,708312452] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,726468965 192.168.5.200] READ TIMEOUT on sequence number 2
[1346,728563201 192.168.5.200] Preparing to WRITE N7:0
[1346,735342447] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,748113389] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,761738205] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,809353011] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,836023694] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,849887201] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,874889492] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,910859952] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,937669092] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,951303608] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1346,975954217] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,12636907] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,39281956] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,51922974] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,77549589] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,114159969] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,139785282] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,153460977] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,178092272] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,214761062] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,232386697] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,241206308] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,253654967] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,279373102] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,316028669] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,332659817] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,342266407] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,354941472] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,381366675] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,417051026] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,433699926] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,443345300] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,456965812] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,482607264] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,517233251] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,534885332] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,544517899] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,558128312] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,582784959] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,618430161] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,636066729] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,644733026] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,659377594] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,684015865] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,719661171] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,737341677] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,745987566] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,760615371] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,785250467] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,820860633] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,838523751] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,849278403] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,873808130] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,886758796] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,922589952] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,938235065] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,951906559] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,979964113] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1347,988950064] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,23624716] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,39291486] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,52955171] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,81573664] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,89188738] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,124771460] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,140416157] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,154091555] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,181736435] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,190387593] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,226044135] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,232688668] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,240318319] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,254925579] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,283568227] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,290221662] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,326835730] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,334475325] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,341072536] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,355677193] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,384290896] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,390917104] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,428510147] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,435162697] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,441781514] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,457419286] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,485010493] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,492615728] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,528211257] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,535845958] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,543471860] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,558114885] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,585726707] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,593426221] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,629036118] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,636659470] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,644282145] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,658910384] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,687512530] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,694176794] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,729780392] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,738495739] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,745112577] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,759746595] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,788475088] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,795147994] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,830754403] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,839390203] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,847391870] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,874639329] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,889610692] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,896480396] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,932162078] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,939815321] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,949481178] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,976124053] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,990765429] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1348,997402786] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,32991381] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,41621257] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,50272009] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,76908950] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,92496400] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,98140621] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,133748218] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,143404965] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,151020256] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,178592755] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,193220075] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,198849928] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,234445759] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,236067668] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,243683324] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,252295084] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,279899391] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,294620209] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,300269480] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,334872644] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,337479984] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,345126303] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,352773976] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,381372043] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,396044082] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,400671168] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,436284544] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,437924829] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,446526750] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,454137252] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,481763580] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,497342024] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,501948702] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,537516058] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,539175501] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,546760338] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,555367881] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,583518602] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,598248844] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,602900970] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,638479153] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,640117253] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,647765862] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,657367686] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,684998804] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,736688623] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,742112737] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,742664306] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,742983325] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,749443264] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,758051172] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,785672398] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,838306157] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,842945841] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,843331705] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,844849234] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,854093671] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,876712047] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,886501441] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,938978936] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,944413104] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,944619988] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,945963901] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,955340267] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,976735014] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1349,987112899] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,39590595] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,45253408] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,45608974] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,47174504] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,55807671] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,77401337] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,88139212] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,139756627] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,146552096] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,146834154] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,148414261] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,157035037] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,178652025] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,189242521] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,234942083] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,240625928] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,247193273] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,247492251] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,249170125] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,257786684] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,279389721] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,290101046] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,336814257] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,341408083] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,348006976] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,348266648] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,350903196] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,359507313] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,380163337] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,390793346] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,438450394] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,442069251] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,448707553] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,448976127] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,452619556] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,460221374] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,480829660] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,492473421] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,539077932] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,542761394] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,548350700] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,550081310] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,553753528] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,560376785] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,581982060] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,593634880] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,640294886] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,642902645] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,649499404] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,651157184] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,653812838] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,661409345] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,682990985] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,694631154] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,741266328] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,743887207] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,750490681] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,752113164] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,754796358] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,762384067] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,783952328] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,795627273] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,842232929] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,844855577] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,851656669] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,853737275] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,859123497] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,863467697] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,981199887] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,981932052] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,982082399] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,982162415] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,982252686] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,982321560] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,982386531] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1350,982451865] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,82901115] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83098369] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83188171] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83255692] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83341278] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83407810] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83474186] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,83539989] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,184936565] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185108049] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185202121] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185268288] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185332425] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185417022] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185483085] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,185548524] Waiting to read for all R/W operations to complete.  Will re-trigger readAllItems in 100ms.
[1351,232430932 192.168.5.200] WRITE TIMEOUT on sequence number 4735

It be very good if libary throw message for example:

nodepcc.on('lostConnection',() => {
});

Best Regards, and thanks again for libary!

Serial port connectivity?

Does this library support connecting to PLC serial port? such as AB Micrologix or AB SLC/5? If so, how to write the initiateConnection() function?

Thanks for a great project!

ECONNRESET error occurs when i want to connect to plc periodically

Hello plcpeople,

Thanks for this great library.

We are using your library in our Meteor project. We want to connect to PLC in every 5 seconds to check if values of tags are changed. So I've set an interval like this:

Meteor.plcTimer = setInterval(function(){ Meteor.call('readWritePLCData', tags); }, 5 * 1000);

And tags is an array contains items like : 'K1001, 'K1002' etc.
Then i call 'readWritePLCData' method like this:

Meteor.methods({ 'readWritePLCData': function(tags){ ... conn.initiateConnection({port: 44818, host: 'xxx.xx.xx.xx' }, connected); function connected(err){ ... conn.readAllItems(valuesReady); ... } } });
Method is basically a copy of your sample except host ip.
I use your "tagLookup" function and it converts tags above to 'B1:0/2', 'B2:0/4' etc.
When i want to log values in valuesReady callback the output is fine:

{ K1317: false,
K1318: false,
K1402: false,
K1316: false,
K1315: false,
K1302: false,
K1405: false,
K1304: false,
K1306: false,
K1308: false,
K1310: false,
K1312: false,
K1314: false }

This output shows correct boolean values and it is shown every 5 seconds. There never is a "SOMETHING WENT WRONG READING VALUES!!!!" output. But after a few minutes this output shows up:

I20170216-09:16:45.455(2)? [1110077,362847744] Initiate Called - Connecting to P
LC with address and parameters:
I20170216-09:16:45.457(2)? [1110077,362933760] { port: 44818, host: 'xxx.xx.xx.x
x' }
I20170216-09:16:45.458(2)? [1110077,363096064] Connection cleanup is happening
I20170216-09:16:45.459(2)? [1110077,363215872 xxx.xx.xx.xx] Attempting to connec
t to host...
I20170216-09:16:45.545(2)? [1110077,445200384 xxx.xx.xx.xx] TCP Connection Estab
lished to xxx.xx.xx.xx on port 44818 - Will attempt EIP Connection
I20170216-09:16:45.583(2)? [1110077,490686464 xxx.xx.xx.xx] We Caught a connect
error ECONNRESET
I20170216-09:16:45.584(2)? { [Error: read ECONNRESET] code: 'ECONNRESET', errno:
'ECONNRESET', syscall: 'read' }
=> Exited with code: 0

After that, node exists the process and Meteor restarts server and everything is fine until ECONNRESET error occurs in just a few minutes.

Our PLC is CompactLogix 5370 L1.

What may cause this problem and how to solve it?

I really appreciate your help.

writeItems callback always receives false

Any idea why the writeItems callback is always passed a false parameter?
This is after a connection is established and read/writes are successful. When controller is disconnected, writes continue to return complete with quality OK. After reconnect, reads begin working again but writes do not.

conn.writeItems(['STR0', 'INT0', 'STR1', 'STR2', 'INT3', 'INT4'],
['Setup Number', 2, 'Customer Name', 'Order Number', 211200, 500500 ],
valuesWritten);

valuesWritten is always passed false, no matter what. ???

Error Bad values

I am running rslogix 500 software (I do not have PLC hardware, so I am using rslogix 500 with emulator) and selected Bul.1761 MicroLogix 1000 DH-485/HDSlave as my controller.
It gets connected and shows online but while reading tag values it shows error as bad values.
Any one please help me with these, I am a novice to this and do not have much knowledge about controllers.

A quick reply will be very helpful for me.

Thank You

Enumerate device tags/registers?

Does the library support the ability to browse/enumerate all registers on the PLC? For example, with SLC5/05, in RSLinx, you can right-click the device and open Data Monitor. This lists all data files on the CPU and allows you to view the live values.

If this is not already a feature, this is a feature request.

Thank you!

Timer and Counter PRE/ACC Values

Currently testing the code and liking it a lot so far! However, when I attempt to read either a timer or counter, PRE or ACC, I always get a value of "0" with no errors. I have confirmed the addresses and values in the PLC, and at least the PRE values are non-zero. All other types seem to read just fine, so I know it's not a connection issue or malformed tags (as mentioned, no errors). Browsing through the code, I didn't notice anything out of the ordinary, but I will continue to research and report back on anything that I might notice causing the problem. I'm using a Micrologix 1400, series B, and the tags I'm trying to read are "T4:0.PRE", "T4:0.ACC", "C5:0.PRE" and "C5:0.ACC". Please let me know if you might have a possible solution to this issue, or at least where to look. Thanks!

0.1.10 crash

Getting this error with new commit.

node-pccc/node_modules/nodepccc/nodePCCC.js:381
NodePCCC.prototype.findItem = function(useraddr) {
^^^^^^^^

SyntaxError: Unexpected identifier
at createScript (vm.js:80:10)
at Object.runInThisContext (vm.js:139:10)
at Module._compile (module.js:616:28)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object. (/Users/stevenebling/node-proj/node-pccc/app.js:1:78)

Allen Bradley Micrologix 1400 PLC Error "Failure (Bad values)"

I'm connected to the MicroLogix-1400, working just fine, until errors.
192.168.254.220 Port 44818
Routing <--- ?? what's that ?
Cycle Time Adjusted it from 500 -700, No differences noted
Timeout, Adjusted it from 1500 - 3500, No differences noted

Node-RED program is simple.
I have
pccc-node-red-failure
Input - 500 ms delay - json true =1; json false =2; on output 1>> Set msg.payload = 0
on output 2>> Set msg.payload = 1.

This is a simple 50% duty cycle at 500ms. It works perfectly... Until
"Failure (Bad values)" erupts on the debug pane. Usually it works for about 5 minutes. and crashes.

The other post about this issue was never addressed... The discussion was about someone failing to connect... Does anyone have any idea what I can do to understand what is going on and how
to clear the error and get back to working?

Kind Regards,
kzy

CompactLogicx issue when write array

Array 3 items

conn.initiateConnection({port: 44818, host: '192.168.1.10' , routing: [0x01 ,0x00,0x01,0x00 ]}, connected);
//works fine
conn.writeItems('N7:0', [66], valuesWritten);  // You can write a single array item too.
//this works fine too
conn.writeItems('N7:1,2', [256,44], valuesWritten);  
//but this throw error
 conn.writeItems('N7:0,1,2', [15,66,26], valuesWritten);

All log

[17229,512552929] Initiate Called - Connecting to PLC with address and parameters:
[17229,514342543] { port: 44818, host: '192.168.1.10', routing: [ 1, 0, 1, 0 ] }
[17229,516549778] Connection cleanup is happening
[17229,517895964 192.168.1.10] Attempting to connect to host...
[17229,520609974 192.168.1.10] TCP Connection Established to 192.168.1.10 on port 44818 - Will attempt EIP Connection
[17229,526448776 192.168.1.10] EIP Register Session Response Received - connection confirmed
[17229,527033550 192.168.1.10] Session Handle is 0xF024D00
[17229,527443668 192.168.1.10] Preparing to WRITE N7:0,1,2

buffer.js:784
    throw TypeError('value is out of bounds');
          ^
TypeError: value is out of bounds
    at TypeError (<anonymous>)
    at checkInt (buffer.js:784:11)
    at Buffer.writeInt16LE (buffer.js:900:5)
    at bufferizePCCCItem (/media/mer/sshd/Projekty/RFID/src/node_modules/nodepccc/nodePCCC.js:1841:25)
    at NodePCCC.prepareWritePacket (/media/mer/sshd/Projekty/RFID/src/node_modules/nodepccc/nodePCCC.js:542:3)
    at NodePCCC.writeItems (/media/mer/sshd/Projekty/RFID/src/node_modules/nodepccc/nodePCCC.js:328:7)
    at NodePCCC.connected [as connectCallback] (/media/mer/sshd/Projekty/RFID/src/bradleyTest/test.js:24:10)
    at NodePCCC.onEIPConnectReply (/media/mer/sshd/Projekty/RFID/src/node_modules/nodepccc/nodePCCC.js:280:8)
    at Socket.<anonymous> (/media/mer/sshd/Projekty/RFID/src/node_modules/nodepccc/nodePCCC.js:225:26)
    at Socket.EventEmitter.emit (events.js:95:17)

This looks like register 0 is not accessible via write array.
Am I doing something wrong?

Looks like nodepccc is sending multiple read request

Hello,
I am using this module to connect to the Allen Bradley PLC , i could see everything is fine until I I try to read the value at addresses of higher value for ex:310 or 410 . When I am reading the address of 410 , It always returns value 0 and also I could see the log message saying
"An oversize packet was detected . Usually because two packets were sent at nearly the same time by the PLC. We slice the buffer and schedule the second half for later processing".
When i captured the network packets , I could see the nodepccc is requesting data has more than one packets rather than one -( refer second screenshot) ( when it sends the read request for lower address value, it usually includes one packets (refer first screenshot) ).
screenshot-1
screenshot-2

Bad Values ControlLogix Slot 8

Hello Gus I'm trying to connect nodepccc to ControlLogix but I'm getting error. My EBNT is on slot 1 but my CPU is on Slot 8. What's the correct routing for that it?

Communication timeout causing node red crashes

Hello,

first of all, thanks for your great library.

I'm using your library to communicate with a CompactLogix L33ERM and I'm getting this error in case of communication failure.

26 May 12:50:27 - TypeError: Cannot read property 'length' of undefined at processSLCWriteItem (/usr/lib/node_modules/node-red-contrib-ccc/node_modules/nodepccc/nodePCCC.js:1572:13) at NodePCCC.writeResponse (/usr/lib/node_modules/node-red-contrib-pccc/node_modules/nodepccc/nodePCCC.js:1270:17) at NodePCCC.packetTimeout (/usr/lib/node_modules/node-red-contrib-pccc/node_modules/nodepccc/nodePCCC.js:232:8) at Timeout._onTimeout (/usr/lib/node_modules/node-red-contrib-pccc/node_modules/nodepccc/nodePCCC.js:1023:24) at ontimeout (timers.js:393:15) at tryOnTimeout (timers.js:250:5) at Timer.listOnTimeout (timers.js:214:5)

String support

Trying to read a string and getting error:

[509683,693316634] Unknown data type when figuring out bad value - should never happen. Should have been caught earlier. STRING

ST9:0
CompactLogix - File Number 9 Mapped to tag ST9 (Data type: STRING[5])

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.