Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

What is the data format for STRING ? #60

Open
georgeplaton7 opened this issue Nov 6, 2019 · 4 comments
Open

What is the data format for STRING ? #60

georgeplaton7 opened this issue Nov 6, 2019 · 4 comments

Comments

@georgeplaton7
Copy link

I've tried to implement the STRING dataformat myself, as I need it.
I was filling up the buffer as a null-ending string , however, the data is not sent correctly.
Is there a specific data format for STRING ?

@nuannuande
Copy link

in ethernet-ip/tag/index.js
line 426 :parseReadMessageResponseValueForAtomic
add code , case 0x2A0:
this.controller_value =data.toString();
break;

@georgeplaton7
Copy link
Author

georgeplaton7 commented Nov 8, 2019

What about writing the string ? I've tried to use generateWriteMessageRequestForAtomic(..) function, to add the case for STRING, and then handle it like below 👍
` see below :

          valBuf = Buffer.alloc(tag.value.length + 1);
           if (!tag.value) valBuf.writeInt8(0x00);

           else {
             valBuf.write(tag.value.toString());

             valBuf.writeInt8(0x00);

           }

           buf = Buffer.concat([buf, valBuf]);

           break;`

However, it keeps giving me error 255 .

Any idea ?

@SerafinTech
Copy link

Just commited STRING and LINT support to my fork: https://github.com/SerafinTech/node-ethernet-ip (Tests still need to be written: USE WITH CAUTION!)

@ilpredo
Copy link

ilpredo commented Oct 12, 2020

If someone still interested this is my solution for read / write string

parseReadMessageResponseValueForAtomic(data) {
...
case 0x2A0: //FROM PLC
let size = data.readUInt32LE(4);
this.controller_value = data.toString('utf8',8).substring(0, size);
break;
...
}

generateWriteMessageRequestForAtomic(value, size) {
...
case STRING:
case 0x2A0:
let msgArr = [];

          //LEN
          let bSize = Buffer.alloc(8);
          bSize.writeUInt16LE(DINT, 0);
          bSize.writeUInt16LE(size, 2);
          bSize.writeInt32LE(value.length, 4);
          
          let pathSize = Buffer.concat([tag.path, CIP.EPATH.segments.DATA.build('LEN')]);
          
          bSize = MessageRouter.build(WRITE_TAG, pathSize, bSize);
          msgArr.push(bSize);
          
          //DATA
          let bValue = Buffer.alloc(4 + value.length);
          bValue.writeUInt16LE(SINT, 0);
          bValue.writeUInt16LE(value.length, 2);
          for (var i = 0; i < value.length; i++)
            bValue.writeInt8(value.charCodeAt(i), 4 + i);
          
          let pathValue = Buffer.concat([tag.path, CIP.EPATH.segments.DATA.build('DATA')]);
          
          bValue = MessageRouter.build(WRITE_TAG, pathValue, bValue);
          msgArr.push(bValue);
          
          //Message - form tag-group generateWriteMessageRequests
          let xbuf = Buffer.alloc(2 + 2 * msgArr.length);
          xbuf.writeUInt16LE(msgArr.length, 0);

          let ptr = 2;
          let offset = xbuf.length;

          for (let i = 0; i < msgArr.length; i++) {
              xbuf.writeUInt16LE(offset, ptr);
              ptr += 2;
              offset += msgArr[i].length;
          }
          
          let pathBuf = Buffer.concat([
              LOGICAL.build(LOGICAL.types.ClassID, 0x02), // Message Router Class ID (0x02)
              LOGICAL.build(LOGICAL.types.InstanceID, 0x01) // Instance ID (0x01)
          ]);

          xbuf = Buffer.concat([xbuf, ...msgArr]);
          xbuf = MessageRouter.build(MULTIPLE_SERVICE_PACKET, pathBuf, xbuf);
          return xbuf;
          
          break;

...
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants