예제 #1
0
        public override async Task <byte[]> SendMsgAsync(byte[] message)
        {
            try
            {
                var pos      = 0;
                var protocal = BigEndianValueHelper.Instance.GetByte(message, ref pos);
                if (protocal == 0)
                {
                    var tagBytes = new byte[message.Length - 6];
                    Array.Copy(message, 1, tagBytes, 0, tagBytes.Length);
                    pos += tagBytes.Length;
                    pos += 4;
                    var split         = Encoding.UTF8.GetString(new[] { message[pos] });
                    var tag           = Encoding.UTF8.GetString(tagBytes);
                    var tagSplit      = SplitTag(tag, split[0]);
                    var rootDirectory = await Client.ExploreFolderAsync("");

                    var answerTag = await SearchTag(tagSplit, split[0], 0, rootDirectory);

                    if (answerTag != null)
                    {
                        var result = await Client.ReadAsync <object>(answerTag);

                        return(BigEndianValueHelper.Instance.GetBytes(result, result.GetType()));
                    }
                    return(Encoding.ASCII.GetBytes("NoData"));
                }
                else
                {
                    var index = 0;
                    for (var i = 1; i < message.Length - 3; i++)
                    {
                        if (message[i] == 0x00 && message[i + 1] == 0xff && message[i + 2] == 0xff &&
                            message[i + 3] == 0x00)
                        {
                            index = i;
                            break;
                        }
                    }

                    var index2 = 0;
                    for (var i = index + 4; i < message.Length - 3; i++)
                    {
                        if (message[i] == 0x00 && message[i + 1] == 0xff && message[i + 2] == 0xff &&
                            message[i + 3] == 0x00)
                        {
                            index2 = i;
                            break;
                        }
                    }

                    var index3 = 0;
                    for (var i = index2 + 4; i < message.Length - 3; i++)
                    {
                        if (message[i] == 0x00 && message[i + 1] == 0xff && message[i + 2] == 0xff &&
                            message[i + 3] == 0x00)
                        {
                            index3 = i;
                            break;
                        }
                    }

                    var tagBytes = new byte[index - 1];
                    Array.Copy(message, 1, tagBytes, 0, tagBytes.Length);
                    var tag        = Encoding.UTF8.GetString(tagBytes);
                    var splitBytes = new byte[index2 - index - 4];
                    Array.Copy(message, index + 4, splitBytes, 0, splitBytes.Length);
                    var split     = Encoding.UTF8.GetString(splitBytes);
                    var typeBytes = new byte[index3 - index2 - 4];
                    Array.Copy(message, index2 + 4, typeBytes, 0, typeBytes.Length);
                    var type       = Type.GetType(Encoding.UTF8.GetString(typeBytes));
                    var valueBytes = new byte[message.Length - index3 - 4];
                    Array.Copy(message, index3 + 4, valueBytes, 0, valueBytes.Length);
                    int mainpos = 0, subpos = 0;
                    var value = BigEndianValueHelper.Instance.GetValue(valueBytes, ref mainpos, ref subpos, type);

                    var rootDirectory = await Client.ExploreFolderAsync("");

                    var tagSplit  = SplitTag(tag, split[0]);
                    var answerTag = await SearchTag(tagSplit, split[0], 0, rootDirectory);

                    if (answerTag != null)
                    {
                        try
                        {
                            await Client.WriteAsync(answerTag, value);
                        }
                        catch (Exception e)
                        {
                            AddInfo("opc write exception:" + e.Message);
                            return(new byte[] { 0 });
                        }
                        return(new byte[] { 1 });
                    }
                    return(new byte[] { 0 });
                }
            }
            catch (Exception e)
            {
                AddInfo("opc client exception:" + e.Message);
                return(Encoding.ASCII.GetBytes("NoData"));
            }
        }
예제 #2
0
        /// <summary>
        ///     带返回发送数据
        /// </summary>
        /// <param name="message">需要发送的数据</param>
        /// <returns>是否发送成功</returns>
        public override async Task <OpcParamOut> SendMsgAsync(OpcParamIn message)
        {
            try
            {
                if (message.IsRead)
                {
                    var split         = message.Split;
                    var tag           = message.Tag;
                    var rootDirectory = await Client.ExploreFolderAsync("");

                    var answerTag = await SearchTag(tag, split, 0, rootDirectory);

                    if (answerTag != null)
                    {
                        var result = await Client.ReadAsync <object>(answerTag);

                        Log.Verbose($"Opc Machine {ConnectionToken} Read opc tag {answerTag} for value {result}");
                        return(new OpcParamOut
                        {
                            Success = true,
                            Value = BigEndianValueHelper.Instance.GetBytes(result, result.GetType())
                        });
                    }
                    return(new OpcParamOut
                    {
                        Success = false,
                        Value = Encoding.ASCII.GetBytes("NoData")
                    });
                }
                else
                {
                    var tag   = message.Tag;
                    var split = message.Split;
                    var value = message.SetValue;

                    var rootDirectory = await Client.ExploreFolderAsync("");

                    var answerTag = await SearchTag(tag, split, 0, rootDirectory);

                    if (answerTag != null)
                    {
                        try
                        {
                            await Client.WriteAsync(answerTag, value);

                            Log.Verbose($"Opc Machine {ConnectionToken} Write opc tag {answerTag} for value {value}");
                        }
                        catch (Exception e)
                        {
                            Log.Error(e, "opc client {ConnectionToken} write exception", ConnectionToken);
                            return(new OpcParamOut
                            {
                                Success = false
                            });
                        }
                        return(new OpcParamOut
                        {
                            Success = true
                        });
                    }
                    return(new OpcParamOut
                    {
                        Success = false
                    });
                }
            }
            catch (Exception e)
            {
                Log.Error(e, "opc client {ConnectionToken} read exception", ConnectionToken);
                return(new OpcParamOut
                {
                    Success = false,
                    Value = Encoding.ASCII.GetBytes("NoData")
                });
            }
        }