public SecsObservableDataContext(SecsGem secsGem) { _secsGem = secsGem; MessageEvents = Observable.FromEvent<EventHandler<PrimaryMessageWrapper>, PrimaryMessageWrapper>( h => _secsGem.PrimaryMessageReceived += h, h => _secsGem.PrimaryMessageReceived -= h); }
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(); }
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; }
/// <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; }
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; }
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; }
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; }
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); }
public SecsObservableDataContext(SecsGem secsGem) { _secsGem = secsGem; MessageEvents = Observable.FromEvent <EventHandler <PrimaryMessageWrapper>, PrimaryMessageWrapper>( h => _secsGem.PrimaryMessageReceived += h, h => _secsGem.PrimaryMessageReceived -= h); }
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"); } }
/// <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; }
private void btnDisable_Click(object sender, EventArgs e) { _secsGem?.Dispose(); _secsGem = null; btnEnable.Enabled = true; btnDisable.Enabled = false; lbStatus.Text = "Disable"; recvBuffer.Clear(); }
public void CanSecsGemBeConstructed() { bool isActive = false; IPAddress ipAddress = IPAddress.Loopback; ushort port = 60000; using (SecsGem secsGem = new SecsGem(isActive, ipAddress, port)) { } }
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(); }
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();
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)) { } }
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; }
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; }
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; } }
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)) { } }); }
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)); } }
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(); }
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(); }
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(); }
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; }
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; }
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(); }
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"); } }
/// <summary> /// 构造方法, 提供SecsGem参数 /// </summary> /// <param name="secsGem"></param> /// <param name="deviceId">设备Id号, 默认为1</param> public CIM4HST(SecsGem secsGem, short deviceId = 1) : base(secsGem, deviceId) { }
internal PrimaryMessageWrapper(SecsGem secsGem, MessageHeader header, SecsMessage msg) { _secsGem = secsGem; _header = header; Message = msg; }