Пример #1
2
 public SecsObservableDataContext(SecsGem secsGem)
 {
     _secsGem = secsGem;
     MessageEvents = Observable.FromEvent<EventHandler<PrimaryMessageWrapper>, PrimaryMessageWrapper>(
         h => _secsGem.PrimaryMessageReceived += h,
         h => _secsGem.PrimaryMessageReceived -= h);
 }
Пример #2
1
 private void btnDisable_Click(object sender, EventArgs e)
 {
     _secsGem?.Dispose();
     _secsGem = null;
     btnEnable.Enabled = true;
     btnDisable.Enabled = false;
     lbStatus.Text = "Disable";
     recvBuffer.Clear();
     richTextBox1.Clear();
 }
Пример #3
0
        private void btnEnable_Click(object sender, EventArgs e)
        {
            _secsGem?.Dispose();
            _secsGem = new SecsGem(
                radioActiveMode.Checked,
                IPAddress.Parse(txtAddress.Text),
                (int)numPort.Value,
                (int)numBufferSize.Value)
            {
                Logger = _logger, DeviceId = (ushort)numDeviceId.Value
            };

            _secsGem.ConnectionChanged += delegate
            {
                this.Invoke((MethodInvoker) delegate
                {
                    lbStatus.Text = _secsGem.State.ToString();
                });
            };

            _secsGem.PrimaryMessageReceived += PrimaryMessageReceived;

            btnEnable.Enabled = false;
            _secsGem.Start();
            btnDisable.Enabled = true;
        }
Пример #4
0
 /// <summary>
 /// 构造方法, 提供SecsGem参数
 /// </summary>
 /// <param name="secsGem"></param>
 /// <param name="deviceId">设备Id号, 默认为1</param>
 public CIMBASE(SecsGem secsGem, short deviceId) : this()
 {
     secsGemService = secsGem;
     secsGemService.ConnectionChanged      += SecsGemService_ConnectionChanged;
     secsGemService.PrimaryMessageReceived += SecsGemService_PrimaryMessageReceived;
     DeviceId = deviceId;
 }
Пример #5
0
        private void btnEnable_Click(object sender, EventArgs e)
        {
            _secsGem?.Dispose();
            _secsGem = new SecsGem(
                radioActiveMode.Checked,
                radioActiveMode.Checked?IPAddress.Parse(txtAddress.Text):IPAddress.Any,
                (int)numPort.Value,
                (int)numBufferSize.Value)
            {
                Logger = _logger, DeviceId = (ushort)numDeviceId.Value
            };
            _secsGem.LinkTestEnable     = true;
            _secsGem.LinkTestInterval   = 60000;
            _secsGem.ConnectionChanged += delegate
            {
                this.Invoke((MethodInvoker) delegate
                {
                    lbStatus.Text = _secsGem.State.ToString();
                    if (_secsGem.State == ConnectionState.Selected && _secsGem.IsActive)
                    {
                        _secsGem.SendAsync(new SecsMessage(1, 13, "Online Request", Item.L(Item.A(), Item.A())));
                    }
                });
            };

            Settings1.Default.ActiveMode = radioActiveMode.Checked;
            Settings1.Default.Save();

            _secsGem.PrimaryMessageReceived += PrimaryMessageReceived;

            btnEnable.Enabled = false;
            _secsGem.Start();
            btnDisable.Enabled = true;
        }
Пример #6
0
        private void Test()
        {
            if (!radioActiveMode.Checked && !radioPassiveMode.Checked)
            {
                MessageBox.Show("Please Choice Connect Mode!!");
                return;
            }
            _secsGem?.Dispose();
            _secsGem = new SecsGem(
                radioActiveMode.Checked,
                IPAddress.Parse(txtAddress.Text),
                (int)numPort.Value,
                (int)numBufferSize.Value)
            {
                Logger = _logger, DeviceId = (ushort)numDeviceId.Value
            };

            SetTimerSetting();

            _secsGem.ConnectionChanged += delegate
            {
                this.Invoke((MethodInvoker) delegate
                {
                    lbStatus.Text = _secsGem.State.ToString();
                });
            };

            _secsGem.PrimaryMessageReceived += PrimaryMessageReceived;

            buttonConnect.Enabled = false;
            _secsGem.Start();
            buttonDisconnect.Enabled = true;
        }
Пример #7
0
        private async void btnEnable_Click(object sender, EventArgs e)
        {
            _secsGem?.Dispose();
            _secsGem = new SecsGem(
                ip: IPAddress.Parse(txtAddress.Text),
                port: (int)numPort.Value,
                isActive: radioActiveMode.Checked,
                tracer: Logger,
                primaryMsgHandler: (primaryMsg, replyAction) =>
                this.Invoke(new MethodInvoker(() =>
                                              recvBuffer.Add(new RecvMessage
            {
                Msg         = primaryMsg,
                ReplyAction = replyAction
            }))));

            _secsGem.ConnectionChanged += delegate
            {
                this.Invoke((MethodInvoker) delegate
                {
                    lbStatus.Text = _secsGem.State.ToString();
                });
            };

            btnEnable.Enabled = false;
            await _secsGem.Start();

            btnDisable.Enabled = true;
        }
Пример #8
0
    public async Task SecsGem_SendAsync_And_Return_Secondary_Message()
    {
        var options = Options.Create(new SecsGemOptions
        {
            SocketReceiveBufferSize = 32,
            DeviceId = 0,
        });

        using var secsGem1 = new SecsGem(options, pipeConnection1, Substitute.For <ISecsGemLogger>());
        using var secsGem2 = new SecsGem(options, pipeConnection2, Substitute.For <ISecsGemLogger>());

        var ping = new SecsMessage(s: 1, f: 13)
        {
            SecsItem = A("Ping"),
        };

        var pong = new SecsMessage(s: 1, f: 14, replyExpected: false)
        {
            SecsItem = A("Pong"),
        };

        using var cts = new CancellationTokenSource();
        _             = pipeConnection1.StartAsync(cts.Token);
        _             = pipeConnection2.StartAsync(cts.Token);
        _             = Task.Run(async() =>
        {
            var msg = await secsGem2.GetPrimaryMessageAsync(cts.Token).FirstAsync(cts.Token);
            msg.PrimaryMessage.Should().BeEquivalentTo(ping);
            await msg.TryReplyAsync(pong);
        });

        var reply = await secsGem1.SendAsync(ping, cts.Token);

        reply.Should().NotBeNull().And.BeEquivalentTo(pong);
    }
Пример #9
0
 public SecsObservableDataContext(SecsGem secsGem)
 {
     _secsGem      = secsGem;
     MessageEvents = Observable.FromEvent <EventHandler <PrimaryMessageWrapper>, PrimaryMessageWrapper>(
         h => _secsGem.PrimaryMessageReceived += h,
         h => _secsGem.PrimaryMessageReceived -= h);
 }
Пример #10
0
        private void btnTest_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                var ev     = new ManualResetEvent(false);
                var config = GetConnectionConfig();
                var ip     = IPAddress.Parse(config.Attribute("ip").Value);
                using (var secsGem = new SecsGem(
                           (bool)config.Attribute("isActive"),
                           IPAddress.Parse(config.Attribute("ip").Value),
                           (int)config.Attribute("port")))
                {
                    secsGem.ConnectionChanged += delegate {
                        if (secsGem.State == ConnectionState.Selected)
                        {
                            ev.Set();
                        }
                    };
                    secsGem.Start();

                    if (!ev.WaitOne(10000))
                    {
                        throw new Exception("timeout");
                    }
                }
                MessageBox.Show("Successed");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Connection Fail");
            }
        }
Пример #11
0
 /// <summary>
 /// 构造方法,提供创建SecsGem所需参数
 /// </summary>
 /// <param name="ipAddress"></param>
 /// <param name="port"></param>
 /// <param name="isActive"></param>
 /// <param name="deviceId">设备Id号, 默认为1</param>
 public CIMBASE(string ipAddress, int port, bool isActive, short deviceId) : this()
 {
     secsGemService = new SecsGem(isActive, IPAddress.Parse(ipAddress), port);
     secsGemService.ConnectionChanged      += SecsGemService_ConnectionChanged;
     secsGemService.ConnectionChanged      += SecsGemService_ConnectionChanged;
     secsGemService.PrimaryMessageReceived += SecsGemService_PrimaryMessageReceived;
     DeviceId = deviceId;
 }
Пример #12
0
 private void btnDisable_Click(object sender, EventArgs e)
 {
     _secsGem?.Dispose();
     _secsGem           = null;
     btnEnable.Enabled  = true;
     btnDisable.Enabled = false;
     lbStatus.Text      = "Disable";
     recvBuffer.Clear();
 }
Пример #13
0
        public void CanSecsGemBeConstructed()
        {
            bool      isActive  = false;
            IPAddress ipAddress = IPAddress.Loopback;
            ushort    port      = 60000;

            using (SecsGem secsGem = new SecsGem(isActive, ipAddress, port))
            {
            }
        }
Пример #14
0
 private void btnDisable_Click(object sender, EventArgs e)
 {
     _secsGem?.Dispose();
     _secsGem = null;
     buttonConnect.Enabled    = true;
     buttonDisconnect.Enabled = false;
     lbStatus.Text            = "Disable";
     recvBuffer.Clear();
     richTextBox2.Clear();
 }
Пример #15
0
    public void Setup()
    {
        const int ItemCount = 16;

        using var message = new SecsMessage(s: 1, f: 2, replyExpected: false)
              {
                  SecsItem = L(
                      L(),
                      U1(MemoryOwner <byte> .Allocate(ItemCount)),
                      U2(MemoryOwner <ushort> .Allocate(ItemCount)),
                      U4(MemoryOwner <uint> .Allocate(ItemCount)),
                      F4(MemoryOwner <float> .Allocate(ItemCount)),
                      A(CreateString(ItemCount, Encoding.ASCII)),
                      J(CreateString(ItemCount, Item.Jis8Encoding)),
                      F8(MemoryOwner <double> .Allocate(ItemCount)),
                      L(
                          I1(MemoryOwner <sbyte> .Allocate(ItemCount)),
                          I2(MemoryOwner <short> .Allocate(ItemCount)),
                          I4(MemoryOwner <int> .Allocate(ItemCount)),
                          F4(MemoryOwner <float> .Allocate(ItemCount)),
                          L(
                              I1(MemoryOwner <sbyte> .Allocate(ItemCount)),
                              I2(MemoryOwner <short> .Allocate(ItemCount)),
                              I4(MemoryOwner <int> .Allocate(ItemCount)),
                              F4(MemoryOwner <float> .Allocate(ItemCount)),
                              Boolean(MemoryOwner <bool> .Allocate(ItemCount)),
                              B(MemoryOwner <byte> .Allocate(ItemCount)),
                              L(
                                  A(CreateString(ItemCount, Encoding.ASCII)),
                                  J(CreateString(ItemCount, Item.Jis8Encoding)),
                                  Boolean(MemoryOwner <bool> .Allocate(ItemCount)),
                                  B(MemoryOwner <byte> .Allocate(ItemCount))),
                              F8(MemoryOwner <double> .Allocate(ItemCount))),
                          Boolean(MemoryOwner <bool> .Allocate(ItemCount)),
                          B(MemoryOwner <byte> .Allocate(ItemCount)),
                          L(
                              A(CreateString(ItemCount, Encoding.ASCII)),
                              J(CreateString(ItemCount, Item.Jis8Encoding)),
                              Boolean(MemoryOwner <bool> .Allocate(ItemCount)),
                              B(MemoryOwner <byte> .Allocate(ItemCount))),
                          F8(MemoryOwner <double> .Allocate(ItemCount))),
                      U1(MemoryOwner <byte> .Allocate(ItemCount)),
                      U2(MemoryOwner <ushort> .Allocate(ItemCount)),
                      U4(MemoryOwner <uint> .Allocate(ItemCount)),
                      F4(MemoryOwner <float> .Allocate(ItemCount))),
              };

        using var buffer = new ArrayPoolBufferWriter <byte>();

        for (var i = 0; i < MessageCount; i++)
        {
            SecsGem.EncodeMessage(message, 1000 + i, deviceId: 0, buffer);
        }

        _encodedBytes = buffer.WrittenSpan.ToArray().Chunk(InputChunkSize).ToArray();
Пример #16
0
        public void CanSecsGemBeConstructedWithInitialReceiveBufferSize()
        {
            bool      isActive  = false;
            IPAddress ipAddress = IPAddress.Loopback;
            ushort    port      = 60000;
            int       initialReceiveBufferSize = 0x4000;

            using (SecsGem secsGem = new SecsGem(isActive, ipAddress, port, initialReceiveBufferSize))
            {
            }
        }
Пример #17
0
 void menuItemGemDisable_Click(object sender, EventArgs e)
 {
     if (_secsGem != null)
     {
         EapLogger.Info("SECS/GEM Stop");
         _secsGem.Dispose();
         _secsGem = null;
     }
     gemStatusLabel.Text        = "Disable";
     menuItemGemDisable.Enabled = false;
     menuItemGemEnable.Enabled  = true;
 }
Пример #18
0
        private void Server_Load(object sender, EventArgs e)
        {
            Thread.CurrentThread.Name = "Main";

            secsGem = new SecsGem(false, IPAddress.Parse("192.168.0.145"), 1024);
            secsGem.ConnectionChanged      += SecsGem_ConnectionChanged;
            secsGem.PrimaryMessageReceived += SecsGem_PrimaryMessageReceived;
            cimServer = new CIM4HST(secsGem);
            cimServer.ScenarioInitialize(this);

            Application.ThreadException += Application_ThreadException;
            AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
        }
Пример #19
0
        private void Dispose(bool disposing)
        {
            if (this.Host != null)
            {
                this.Host.Dispose();
                this.Host = null;
            }

            if (this.Equipment != null)
            {
                this.Equipment.Dispose();
                this.Equipment = null;
            }
        }
Пример #20
0
        public void CanSecsGemNotBeConstructedWithNegativInitialReceiveBufferSize()
        {
            bool      isActive  = false;
            IPAddress ipAddress = IPAddress.Loopback;
            ushort    port      = 60000;
            int       initialReceiveBufferSize = -1;

            Assert.ThrowsException <ArgumentOutOfRangeException>(() =>
            {
                using (SecsGem secsGem = new SecsGem(isActive, ipAddress, port, initialReceiveBufferSize))
                {
                }
            });
        }
Пример #21
0
        public static Task <SecsMessage> SendMessage(this SecsGem secsGem, short deviceId, byte s, byte f, bool replyExpected, int systemBytes, Item item = null, string key = "", int value = 0)
        {
            SecsMessage secsMessage = new SecsMessage(s, f, replyExpected, GetFunctionName(s, f, key, value), item);

            CIMBASE.WriteLog(AATS.Log.LogLevel.INFO, "\r\n" + secsMessage.ToSml());
            if (systemBytes == -1)
            {
                return(secsGem.SendAsync(secsMessage));
            }
            else
            {
                return(secsGem.SendAsync(secsMessage, systemBytes));
            }
        }
Пример #22
0
        public CentralWinform()
        {
            InitializeComponent();
            IPAddress address = IPAddress.Parse("10.215.0.2");

            _secsGem = new SecsGem(
                true,
                address,
                5005)
            {
                DeviceId         = 0,
                LinkTestInterval = 60000,
                T3     = 120,
                T5     = 30,
                T6     = 5,
                T7     = 100,
                T8     = 5,
                Logger = null
            };
            _secsGem.ConnectionChanged += delegate
            {
                Invoke((MethodInvoker) delegate
                {
                    Console.WriteLine("SECS/GEM " + _secsGem.State);
                    gemStatusLabel88.Text      = _secsGem.State.ToString();
                    eqpAddressStatusLabel.Text = "Device IP: " + _secsGem.DeviceIpAddress;
                    if (_secsGem.State == Secs4Net.ConnectionState.Selected && !hasSentS1F3)
                    {
                        //EstablishComm
                        //_secsGem.SendAsync(new SecsMessage(1, 13, "TestCommunicationsRequest", Item.L()));
                        //Thread.Sleep(100);

                        //Thread.Sleep(100);

                        //Thread.Sleep(100);
                        ////PurgeSpool
                        //_secsGem.SendAsync(new SecsMessage(6, 43, "PurgeSpool", Item.U1(1)));
                        //Thread.Sleep(100);
                        ////DisableAllEvents
                        //_secsGem.SendAsync(new SecsMessage(2, 37, "DisableAllEvents", Item.L(Item.Boolean(false), Item.L())));
                        ////DisableAllAlarms
                        //_secsGem.SendAsync(new SecsMessage(5, 3, "DisableAllEvents", Item.L(Item.Boolean(false), Item.L())));
                        hasSentS1F3 = true;
                    }
                });
            };
            _secsGem.PrimaryMessageReceived += PrimaryMsgHandler;
            _secsGem.Start();
        }
Пример #23
0
    public void SecsGem_SendAsync_With_Different_Device_Id()
    {
        var options1 = Options.Create(new SecsGemOptions
        {
            SocketReceiveBufferSize = 32,
            DeviceId = 0,
        });
        var options2 = Options.Create(new SecsGemOptions
        {
            SocketReceiveBufferSize = 32,
            DeviceId = 1,
        });

        using var secsGem1 = new SecsGem(options1, pipeConnection1, Substitute.For <ISecsGemLogger>());
        using var secsGem2 = new SecsGem(options2, pipeConnection2, Substitute.For <ISecsGemLogger>());

        var ping = new SecsMessage(s: 1, f: 13)
        {
            SecsItem = A("Ping"),
        };

        using var cts = new CancellationTokenSource();
        _             = pipeConnection1.StartAsync(cts.Token);
        _             = pipeConnection2.StartAsync(cts.Token);

        var receiver = Substitute.For <Action <SecsMessage> >();

        _ = Task.Run(async() =>
        {
            await foreach (var a in secsGem2.GetPrimaryMessageAsync(cts.Token))
            {
                // can't receive any message, reply S9F1 internally
                receiver(a.PrimaryMessage);
            }
        });

        Func <Task> sendAsync = async() =>
        {
            var reply = await secsGem1.SendAsync(ping, cts.Token);
        };

        sendAsync.Should().ThrowAsync <SecsException>().WithMessage(Resources.S9F1);
        receiver.DidNotReceive();
    }
Пример #24
0
    public void SecsGem_SendAsync_With_T3_Timeout()
    {
        var options1 = Options.Create(new SecsGemOptions
        {
            SocketReceiveBufferSize = 32,
            DeviceId = 0,
            T3       = 500,
        });

        using var secsGem1 = new SecsGem(options1, pipeConnection1, Substitute.For <ISecsGemLogger>());
        using var secsGem2 = new SecsGem(options1, pipeConnection2, Substitute.For <ISecsGemLogger>());

        var ping = new SecsMessage(s: 1, f: 13)
        {
            SecsItem = A("Ping"),
        };
        var pong = new SecsMessage(s: 1, f: 14, replyExpected: false)
        {
            SecsItem = A("Pong"),
        };

        using var cts = new CancellationTokenSource();

        _ = Task.Run(async() =>
        {
            await foreach (var a in secsGem2.GetPrimaryMessageAsync(cts.Token))
            {
                await Task.Delay(TimeSpan.FromMilliseconds(options1.Value.T3 + 100)); // process delay over T3
                await a.TryReplyAsync(pong);
            }
        });

        var         receiver  = Substitute.For <Action>();
        Func <Task> sendAsync = async() =>
        {
            var reply = await secsGem1.SendAsync(ping, cts.Token);

            receiver();
        };

        sendAsync.Should().ThrowAsync <SecsException>().WithMessage(Resources.T3Timeout);
        receiver.DidNotReceive();
    }
Пример #25
0
        void menuItemGemEnable_Click(object sender, EventArgs e)
        {
            EapLogger.Info("SECS/GEM Start");
            gemStatusLabel.Text = "Start";
            _secsGem?.Dispose();
            _secsGem = new SecsGem(
                EAPConfig.Instance.Mode == ConnectionMode.Active,
                IPAddress.Parse(EAPConfig.Instance.IP),
                EAPConfig.Instance.TcpPort, EAPConfig.Instance.SocketRecvBufferSize)
            {
                DeviceId         = EAPConfig.Instance.DeviceId,
                LinkTestInterval = EAPConfig.Instance.LinkTestInterval,
                T3     = EAPConfig.Instance.T3,
                T5     = EAPConfig.Instance.T5,
                T6     = EAPConfig.Instance.T6,
                T7     = EAPConfig.Instance.T7,
                T8     = EAPConfig.Instance.T8,
                Logger = new SecsLogger()
            };
            _secsGem.ConnectionChanged += delegate
            {
                this.Invoke((MethodInvoker) delegate
                {
                    EapLogger.Info("SECS/GEM " + _secsGem.State);
                    gemStatusLabel.Text        = _secsGem.State.ToString();
                    eqpAddressStatusLabel.Text = "Device IP: " + _secsGem.DeviceAddress;
                    if (_secsGem.State == ConnectionState.Selected)
                    {
                        _secsGem.SendAsync(new SecsMessage(1, 13, "TestCommunicationsRequest", Item.L()));
                    }
                });
            };

            _secsGem.PrimaryMessageReceived += PrimaryMsgHandler;
            _secsGem.Start();
            menuItemGemDisable.Enabled = true;
            menuItemGemEnable.Enabled  = false;
        }
Пример #26
0
        private void btnEnable_Click(object sender, EventArgs e)
        {
            _secsGem?.Dispose();
            _secsGem = new SecsGem(
                radioActiveMode.Checked,
                IPAddress.Parse(txtAddress.Text),
                (int)numPort.Value,
                (int)numBufferSize.Value)
            { Logger = _logger, DeviceId = (ushort)numDeviceId.Value };

            _secsGem.ConnectionChanged += delegate
            {
                this.Invoke((MethodInvoker)delegate
                {
                    lbStatus.Text = _secsGem.State.ToString();
                });
            };

            _secsGem.PrimaryMessageReceived += PrimaryMessageReceived;

            btnEnable.Enabled = false;
            _secsGem.Start();
            btnDisable.Enabled = true;
        }
Пример #27
0
    private void SendAsyncManyMessagesAtOnce(ISecsConnection connection1, ISecsConnection connection2, CancellationToken cancellation)
    {
        var secsGem1 = new SecsGem(optionsActive, connection1, Substitute.For <ISecsGemLogger>());
        var secsGem2 = new SecsGem(optionsPassive, connection2, Substitute.For <ISecsGemLogger>());

        _ = Task.Run(async() =>
        {
            var pong = new SecsMessage(s: 1, f: 14, replyExpected: false)
            {
                SecsItem = A("Pong"),
            };

            await foreach (var a in secsGem2.GetPrimaryMessageAsync(cancellation))
            {
                await a.TryReplyAsync(pong);
            }
        });

        Func <Task> sendAsync = async() =>
        {
            var ping = new SecsMessage(s: 1, f: 13)
            {
                SecsItem = A("Ping"),
            };

            var sendCount  = 10000;
            var totalTasks = new List <Task <SecsMessage> >(capacity: sendCount);
            for (var g = 0; g < sendCount; g++)
            {
                totalTasks.Add(secsGem1.SendAsync(ping, cancellation).AsTask());
            }
            await Task.WhenAll(totalTasks.ToArray());
        };

        sendAsync.Should().NotThrowAsync();
    }
Пример #28
0
		private void btnTest_Click(object sender, RoutedEventArgs e)
		{
			try
			{
                var ev = new ManualResetEvent(false);
                var config = GetConnectionConfig();
                var ip = IPAddress.Parse(config.Attribute("ip").Value);
                using (var secsGem = new SecsGem(
                    (bool)config.Attribute("isActive"),
                    IPAddress.Parse(config.Attribute("ip").Value),
                    (int)config.Attribute("port")))
                {
                    secsGem.ConnectionChanged += delegate {
                        if (secsGem.State == ConnectionState.Selected)
                            ev.Set();
                    };
                    secsGem.Start();

                    if (!ev.WaitOne(10000))
                        throw new Exception("timeout");
                }
                MessageBox.Show("Successed");

            }
			catch (Exception ex)
			{
				MessageBox.Show(ex.Message, "Connection Fail");
			}
		}
Пример #29
0
 /// <summary>
 /// 构造方法, 提供SecsGem参数
 /// </summary>
 /// <param name="secsGem"></param>
 /// <param name="deviceId">设备Id号, 默认为1</param>
 public CIM4HST(SecsGem secsGem, short deviceId = 1) : base(secsGem, deviceId)
 {
 }
Пример #30
0
 internal PrimaryMessageWrapper(SecsGem secsGem, MessageHeader header, SecsMessage msg)
 {
     _secsGem = secsGem;
     _header = header;
     Message = msg;
 }