コード例 #1
0
 private static void BuildReadRecordApdu(CommandApdu command, RecordAddress address, byte idx)
 {
     command.CLA         = 0;
     command.Instruction = InstructionCode.ReadRecord;
     command.P1          = idx;
     command.P2          = (byte)((address.SFI << 3) + 0x4);
 }
コード例 #2
0
        /// <summary>
        /// 初始化ASDU,使用一大堆参数(无类型标识的初始化)
        /// </summary>
        /// <param name="cot">传送原因</param>
        /// <param name="isTest">是否测试</param>
        /// <param name="isNegative">肯定/否定回答</param>
        /// <param name="ca"> 应用服务数据单元公共地址 </param>
        /// <param name="ra">记录地址</param>
        /// <param name="isSequence">是否连续单元(用于构造VSQ),数量根据添加来变</param>

        public ASDU(CauseOfTransmission cot, bool isTest, bool isNegative, int ca, RecordAddress ra, bool isSequence)
            : this(TypeID.M_SP_TA_2, cot, isTest, isNegative, ca, ra, isSequence)
        {
            //这里标志一下,没有类型标识,也就是说在初始化ASDU的时候不加类型标识
            //当在增加信息对象的时候,类型标识根据信息对象的标识来确定。
            this.hasTypeId = false;
        }
コード例 #3
0
        /// <summary>
        /// 使用buff初始化一个ASDU,相当于解析
        /// </summary>
        /// <param name="parameters">链接参数</param>
        /// <param name="msg">接收到的消息内容(整个报文)里面自动跳掉头了。。</param>
        /// <param name="msgLength">消息长度(整个报文的长度,包括报文头)</param>
        public ASDU(ConnectionParameters parameters, byte[] msg, int msgLength)
        {
            //保存链接参数
            this.parameters = parameters.clone();

            //跳过报文头,68H+长度(2)+68H + 链路控制域(1) + 链路地址(2)
            int bufPos = 7;

            typeId = (TypeID)msg[bufPos++];     //类型标识

            vsq = msg[bufPos++];                //可变结构限定词

            this.hasTypeId = true;

            byte cotByte = msg[bufPos++];       //传送原因

            //测试标志--0 未试验(false),1  试验(true)
            if ((cotByte & 0x80) != 0)
            {
                isTest = true;
            }
            else
            {
                isTest = false;
            }

            //确认标志,0  肯定确认(false) ,1 否定确认(true)
            if ((cotByte & 0x40) != 0)
            {
                isNegative = true;
            }
            else
            {
                isNegative = false;
            }

            //传送原因
            cot = (CauseOfTransmission)(cotByte & 0x3f);

            //电能量数据终端设备地址(2字节)
            ca = msg[bufPos++];
            if (parameters.SizeOfCA > 1)
            {
                ca += (msg[bufPos++] * 0x100);
            }

            //记录地址
            ra = (RecordAddress)msg[bufPos++];        //类型标识

            int payloadSize = msgLength - bufPos - 2; //把最后的和校验和结束符去掉

            payload = new byte[payloadSize];

            /* save payload */
            Buffer.BlockCopy(msg, bufPos, payload, 0, payloadSize);
        }
コード例 #4
0
        private static List <RecordAddress> ParseAddresses(byte[] data)
        {
            List <RecordAddress> results = new List <RecordAddress>();

            for (int idx = 0; idx < data.Length; idx += 4)
            {
                var newAddress = new RecordAddress()
                {
                    SFI            = data[idx + 0] >> 3,
                    FromRecord     = data[idx + 1],
                    ToRecord       = data[idx + 2],
                    OfflineAddress = data[idx + 3],
                };
                results.Add(newAddress);
            }
            return(results);
        }
コード例 #5
0
        /// <summary>
        /// 初始化ASDU,使用一大堆参数
        /// </summary>
        /// <param name="typeId">类型标识</param>
        /// <param name="cot">传送原因</param>
        /// <param name="isTest">是否测试</param>
        /// <param name="isNegative">肯定/否定回答</param>
        /// <param name="ca"> 应用服务数据单元公共地址 </param>
        /// <param name="ra">记录地址</param>
        /// <param name="isSequence">是否连续单元(用于构造VSQ),数量根据添加来变</param>
        public ASDU(TypeID typeId, CauseOfTransmission cot, bool isTest, bool isNegative, int ca, RecordAddress ra, bool isSequence)
        {
            this.typeId     = typeId;
            this.cot        = cot;
            this.isTest     = isTest;
            this.isNegative = isNegative;
            this.ra         = ra;
            this.ca         = ca;

            if (isSequence)
            {
                this.vsq = 0x80;
            }
            else
            {
                this.vsq = 0;
            }

            this.hasTypeId = true;
        }