package javaforce.controls.ab; import javaforce.LE; /** CIP : Connection Manager : Request * * @author pquiring */ public class CIP_Request { //CIP header public byte cmd = (byte)0x52; public byte count = 2; public byte path_1 = 0x20; //8bit class segment public byte class_1 = 0x06; //connection manager public byte path_2 = 0x24; //8bit instance segment public byte class_2 = 0x01; //instance //connection manager header public byte ticktime = 0x07; public byte ticktimeout = (byte)0xf9; public short len; //size of following {} in bytes //{ public byte service; public byte tag_size; //size of following {} in 16bit words //{ public byte tag_type = (byte)0x91; //ascii tag public byte tag_len; public byte[] tag_chars; //1 byte padding if tag_type/tag_len/tag is not multiple of 16bit words //} public byte tagdata[]; //} public byte route_size = 0x01; //size of following {} in 16bit words public byte route_res = 0x00; //reserved //{ public byte route_seg = 0x01; public byte route_addr = 0x00; //} public static final byte SERVICE_READTAG = 0x4c; public static final byte SERVICE_WRITETAG = 0x4d; public int size() { int size = 18 + tag_chars.length + tagdata.length; if (tag_chars.length % 2 != 0) { size++; //padding } return size; } public void write(byte data[], int offset) throws Exception { data[offset++] = cmd; data[offset++] = count; data[offset++] = path_1; data[offset++] = class_1; data[offset++] = path_2; data[offset++] = class_2; data[offset++] = ticktime; data[offset++] = ticktimeout; LE.setuint16(data, offset, len); offset += 2; data[offset++] = service; data[offset++] = tag_size; data[offset++] = tag_type; data[offset++] = tag_len; System.arraycopy(tag_chars, 0, data, offset, tag_chars.length); offset += tag_chars.length; if (tag_chars.length % 2 != 0) { data[offset++] = 0; //padding } System.arraycopy(tagdata, 0, data, offset, tagdata.length); offset += tagdata.length; data[offset++] = route_size; data[offset++] = route_res; data[offset++] = route_seg; data[offset++] = route_addr; } public void setRead(String tag) { service = SERVICE_READTAG; tag_len = (byte)tag.length(); tag_chars = tag.getBytes(); tagdata = new byte[] {0x01, 0x00}; setLengths(); } public void setWrite(String tag, byte type, byte data[]) { service = SERVICE_WRITETAG; tag_len = (byte)tag.length(); tag_chars = tag.getBytes(); tagdata = new byte[4 + data.length]; tagdata[0] = type; tagdata[1] = 0; tagdata[2] = 1; tagdata[3] = 0; System.arraycopy(data, 0, tagdata, 4, data.length); setLengths(); } private void setLengths() { len = (short)(4 + tag_chars.length + tagdata.length); if (tag_chars.length % 2 != 0) { len++; //padding } tag_size = (byte)((2 + tag_chars.length + 1) >> 1); } }