Difference between revisions of "Subscribing to PLC data via code"
(Created page with "The AdvancedHMI drivers support a subscription that will automatically poll data and return the values. The DataSubscriber provides a non-code method of using this service. Ho...") |
(→C# Example:) |
||
(8 intermediate revisions by 2 users not shown) | |||
Line 1: | Line 1: | ||
+ | |||
+ | == VB Example: == | ||
+ | |||
The AdvancedHMI drivers support a subscription that will automatically poll data and return the values. The DataSubscriber provides a non-code method of using this service. However, there are times when it is desired or more efficient to subscribe using code. This is an example on how to do this: | The AdvancedHMI drivers support a subscription that will automatically poll data and return the values. The DataSubscriber provides a non-code method of using this service. However, there are times when it is desired or more efficient to subscribe using code. This is an example on how to do this: | ||
Line 9: | Line 12: | ||
Private Sub Subscription_DataReceived(sender As Object, e As Drivers.Common.PlcComEventArgs) | Private Sub Subscription_DataReceived(sender As Object, e As Drivers.Common.PlcComEventArgs) | ||
− | Label1.Text = e.Values(0) | + | If e.ErrorId=0 AndAlso e.Values IsNot Nothing AndAlso e.Values.Count>0 Then |
+ | Label1.Text = e.Values(0) | ||
+ | End If | ||
End Sub | End Sub | ||
Line 17: | Line 22: | ||
− | The rate at which | + | The rate at which data is polled is determined by the value of the PollRateOverride property. |
Each driver is highly optimized for communications using subscriptions. All of the visual controls (e.g. Gauge) use the subscription mechanism to receive their data. | Each driver is highly optimized for communications using subscriptions. All of the visual controls (e.g. Gauge) use the subscription mechanism to receive their data. | ||
+ | |||
+ | |||
+ | == C# Example: == | ||
+ | |||
+ | |||
+ | The Following is an example of how to programmatically set PLC Items to a dataSubscriber2 component. | ||
+ | |||
+ | First you must create 3 com drivers and 3 dataSubscriber2 components that are bound to the 3 com drivers | ||
+ | |||
+ | |||
+ | the example below uses 3 EthernetIPforSLCMicroCom components with poll rate overrides of: | ||
+ | |||
+ | Slow: 1000; (CommDewax1Slow) | ||
+ | |||
+ | Medium: 500; (CommDewax1Medium) | ||
+ | |||
+ | Fast: 100; (CommDewax1Fast) | ||
+ | |||
+ | |||
+ | Be sure to set the "DataChanged" Event handler to the custom methods below | ||
+ | |||
+ | using AdvancedHMIDrivers; | ||
+ | using AdvancedHMIControls; | ||
+ | using MfgControl.AdvancedHMI.Drivers; | ||
+ | using System; | ||
+ | using System.Collections.Generic; | ||
+ | using System.ComponentModel; | ||
+ | using System.Data; | ||
+ | using System.Drawing; | ||
+ | using System.Linq; | ||
+ | using System.Text; | ||
+ | using System.Threading.Tasks; | ||
+ | using System.Windows.Forms; | ||
+ | using MfgControl.AdvancedHMI.Drivers.Common; | ||
+ | // | ||
+ | namespace AdvancedHMICS | ||
+ | { | ||
+ | public partial class MainForm : Form | ||
+ | { | ||
+ | #region PLCItemsLists | ||
+ | List<PLCAddressItem> PLCDewaxer1SlowItems = new List<PLCAddressItem>(); | ||
+ | List<PLCAddressItem> PLCDewaxer1MediumItems = new List<PLCAddressItem>(); | ||
+ | List<PLCAddressItem> PLCDewaxer1FastItems = new List<PLCAddressItem>(); | ||
+ | #endregion | ||
+ | public MainForm() | ||
+ | { | ||
+ | InitializeComponent(); | ||
+ | #region DataSubscribers (Continuation) | ||
+ | #region Add PLCItems (Slow, Medium, Fast) | ||
+ | #region Add PLCSlowItems | ||
+ | PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:1")); | ||
+ | PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:2")); | ||
+ | PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:3")); | ||
+ | PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:4")); | ||
+ | PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:5")); | ||
+ | #endregion | ||
+ | #region Add PLCMediumItems | ||
+ | PLCDewaxer1MediumItems.Add(new PLCAddressItem("C5:1.ACC")); | ||
+ | PLCDewaxer1MediumItems.Add(new PLCAddressItem("C5:2.ACC")); | ||
+ | PLCDewaxer1MediumItems.Add(new PLCAddressItem("C5:3.ACC")); | ||
+ | #endregion | ||
+ | #region Add PLCFastItems | ||
+ | PLCDewaxer1FastItems.Add(new PLCAddressItem("N7:1")); | ||
+ | PLCDewaxer1FastItems.Add(new PLCAddressItem("N7:2")); | ||
+ | PLCDewaxer1FastItems.Add(new PLCAddressItem("N7:3")); | ||
+ | #endregion | ||
+ | #endregion | ||
+ | // bind the PLCAddressItems to the Subscribers | ||
+ | for (var i = 0; i < PLCDewaxer1SlowItems.Count(); i ++) | ||
+ | { | ||
+ | DataDewax1Slow.PLCAddressValueItems.Add(PLCDewaxer1SlowItems[i]); | ||
+ | } | ||
+ | for (var i = 0; i < PLCDewaxer1MediumItems.Count(); i++) | ||
+ | { | ||
+ | DataDewax1Medium.PLCAddressValueItems.Add(PLCDewaxer1MediumItems[i]); | ||
+ | } | ||
+ | for (var i = 0; i < PLCDewaxer1FastItems.Count(); i++) | ||
+ | { | ||
+ | DataDewax1Fast.PLCAddressValueItems.Add(PLCDewaxer1FastItems[i]); | ||
+ | } | ||
+ | #endregion | ||
+ | } | ||
+ | private void DataDewax1Slow_DataChanged(object sender, PlcComEventArgs e) | ||
+ | { | ||
+ | if (e.ErrorId == 0 && e.Values != null && e.Values.Count() > 0) | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | if (e.PlcAddress == "F8:1") | ||
+ | { | ||
+ | label1.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "F8:2") | ||
+ | { | ||
+ | label2.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "F8:3") | ||
+ | { | ||
+ | label3.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "F8:4") | ||
+ | { | ||
+ | label4.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "F8:5") | ||
+ | { | ||
+ | label5.Text = e.Values[0]; | ||
+ | } | ||
+ | } | ||
+ | catch (Exception ex) | ||
+ | { | ||
+ | errorMsg1.Text = "Source: " + ex.Source + " Message: " + ex.Message; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | private void DataDewax1Medium_DataChanged(object sender, PlcComEventArgs e) | ||
+ | { | ||
+ | if (e.ErrorId == 0 && e.Values != null && e.Values.Count() > 0) | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | if (e.PlcAddress == "C5:1.ACC") | ||
+ | { | ||
+ | label6.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "C5:2.ACC") | ||
+ | { | ||
+ | label7.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "C5:3.ACC") | ||
+ | { | ||
+ | label8.Text = e.Values[0]; | ||
+ | } | ||
+ | } | ||
+ | catch (Exception ex) | ||
+ | { | ||
+ | errorMsg2.Text = "Source: " + ex.Source + " Message: " + ex.Message; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | private void DataDewax1Fast_DataChanged(object sender, PlcComEventArgs e) | ||
+ | { | ||
+ | if (e.ErrorId == 0 && e.Values != null && e.Values.Count() > 0) | ||
+ | { | ||
+ | try | ||
+ | { | ||
+ | if (e.PlcAddress == "N7:1") | ||
+ | { | ||
+ | label9.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "N7:2") | ||
+ | { | ||
+ | label10.Text = e.Values[0]; | ||
+ | } | ||
+ | if (e.PlcAddress == "N7:3") | ||
+ | { | ||
+ | label11.Text = e.Values[0]; | ||
+ | } | ||
+ | } | ||
+ | catch (Exception ex) | ||
+ | { | ||
+ | errorMsg3.Text = "Source: " + ex.Source + " Message: " + ex.Message; | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } | ||
+ | } |
Latest revision as of 08:06, 17 May 2018
VB Example:
The AdvancedHMI drivers support a subscription that will automatically poll data and return the values. The DataSubscriber provides a non-code method of using this service. However, there are times when it is desired or more efficient to subscribe using code. This is an example on how to do this:
Private SubscriptionID1 As Integer Private Sub Button2_Click_1(sender As Object, e As EventArgs) Handles Button2.Click SubscriptionID1 = EthernetIPforCLXCom1.Subscribe("MyTag", 1, 500, AddressOf Subscription_DataReceived) End Sub
Private Sub Subscription_DataReceived(sender As Object, e As Drivers.Common.PlcComEventArgs) If e.ErrorId=0 AndAlso e.Values IsNot Nothing AndAlso e.Values.Count>0 Then Label1.Text = e.Values(0) End If End Sub
Private Sub MainForm_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing EthernetIPforCLXCom1.UnSubscribe(SubscriptionID1) End Sub
The rate at which data is polled is determined by the value of the PollRateOverride property.
Each driver is highly optimized for communications using subscriptions. All of the visual controls (e.g. Gauge) use the subscription mechanism to receive their data.
C# Example:
The Following is an example of how to programmatically set PLC Items to a dataSubscriber2 component.
First you must create 3 com drivers and 3 dataSubscriber2 components that are bound to the 3 com drivers
the example below uses 3 EthernetIPforSLCMicroCom components with poll rate overrides of:
Slow: 1000; (CommDewax1Slow)
Medium: 500; (CommDewax1Medium)
Fast: 100; (CommDewax1Fast)
Be sure to set the "DataChanged" Event handler to the custom methods below
using AdvancedHMIDrivers; using AdvancedHMIControls; using MfgControl.AdvancedHMI.Drivers; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using MfgControl.AdvancedHMI.Drivers.Common; // namespace AdvancedHMICS { public partial class MainForm : Form { #region PLCItemsLists List<PLCAddressItem> PLCDewaxer1SlowItems = new List<PLCAddressItem>(); List<PLCAddressItem> PLCDewaxer1MediumItems = new List<PLCAddressItem>(); List<PLCAddressItem> PLCDewaxer1FastItems = new List<PLCAddressItem>(); #endregion public MainForm() { InitializeComponent(); #region DataSubscribers (Continuation) #region Add PLCItems (Slow, Medium, Fast) #region Add PLCSlowItems PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:1")); PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:2")); PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:3")); PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:4")); PLCDewaxer1SlowItems.Add(new PLCAddressItem("F8:5")); #endregion #region Add PLCMediumItems PLCDewaxer1MediumItems.Add(new PLCAddressItem("C5:1.ACC")); PLCDewaxer1MediumItems.Add(new PLCAddressItem("C5:2.ACC")); PLCDewaxer1MediumItems.Add(new PLCAddressItem("C5:3.ACC")); #endregion #region Add PLCFastItems PLCDewaxer1FastItems.Add(new PLCAddressItem("N7:1")); PLCDewaxer1FastItems.Add(new PLCAddressItem("N7:2")); PLCDewaxer1FastItems.Add(new PLCAddressItem("N7:3")); #endregion #endregion // bind the PLCAddressItems to the Subscribers for (var i = 0; i < PLCDewaxer1SlowItems.Count(); i ++) { DataDewax1Slow.PLCAddressValueItems.Add(PLCDewaxer1SlowItems[i]); } for (var i = 0; i < PLCDewaxer1MediumItems.Count(); i++) { DataDewax1Medium.PLCAddressValueItems.Add(PLCDewaxer1MediumItems[i]); } for (var i = 0; i < PLCDewaxer1FastItems.Count(); i++) { DataDewax1Fast.PLCAddressValueItems.Add(PLCDewaxer1FastItems[i]); } #endregion } private void DataDewax1Slow_DataChanged(object sender, PlcComEventArgs e) { if (e.ErrorId == 0 && e.Values != null && e.Values.Count() > 0) { try { if (e.PlcAddress == "F8:1") { label1.Text = e.Values[0]; } if (e.PlcAddress == "F8:2") { label2.Text = e.Values[0]; } if (e.PlcAddress == "F8:3") { label3.Text = e.Values[0]; } if (e.PlcAddress == "F8:4") { label4.Text = e.Values[0]; } if (e.PlcAddress == "F8:5") { label5.Text = e.Values[0]; } } catch (Exception ex) { errorMsg1.Text = "Source: " + ex.Source + " Message: " + ex.Message; } } } private void DataDewax1Medium_DataChanged(object sender, PlcComEventArgs e) { if (e.ErrorId == 0 && e.Values != null && e.Values.Count() > 0) { try { if (e.PlcAddress == "C5:1.ACC") { label6.Text = e.Values[0]; } if (e.PlcAddress == "C5:2.ACC") { label7.Text = e.Values[0]; } if (e.PlcAddress == "C5:3.ACC") { label8.Text = e.Values[0]; } } catch (Exception ex) { errorMsg2.Text = "Source: " + ex.Source + " Message: " + ex.Message; } } } private void DataDewax1Fast_DataChanged(object sender, PlcComEventArgs e) { if (e.ErrorId == 0 && e.Values != null && e.Values.Count() > 0) { try { if (e.PlcAddress == "N7:1") { label9.Text = e.Values[0]; } if (e.PlcAddress == "N7:2") { label10.Text = e.Values[0]; } if (e.PlcAddress == "N7:3") { label11.Text = e.Values[0]; } } catch (Exception ex) { errorMsg3.Text = "Source: " + ex.Source + " Message: " + ex.Message; } } } } }