Я разрабатываю клиентский OPC-клиент C#, я начал писать в консольном приложении быстро, все работает отлично, как я хочу.C# OPC Приложения Идентичный код, но работают по-другому
Затем я решил сделать приложение в виде окна для визуального восприятия.
Приложение для создания окон просто прекращает работу, прекращает чтение данных с сервера OPC примерно через минуту. Где, когда консольное приложение продолжает читать и читать.
Я не могу найти ничего очевидного в режиме отладки.
Я абсолютно сжимаю соломинку здесь и, надеюсь, кто-то может пролить свет.
Каждое приложение использует DLL-файлы, предоставленные OPCFoundation.
Вот консольное приложение
static void Main(string[] args)
{
Opc.URL url = new Opc.URL("opcda://localhost/RSLinx OPC Server");
Opc.Da.Server server = null;
OpcCom.Factory fact = new OpcCom.Factory();
server = new Opc.Da.Server(fact, null);
server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));
// Create a group
Opc.Da.Subscription group;
Opc.Da.SubscriptionState groupState = new Opc.Da.SubscriptionState();
groupState.Name = "Group";
groupState.Active = true;
group = (Opc.Da.Subscription)server.CreateSubscription(groupState);
// add items to the group.
Opc.Da.Item[] items = new Opc.Da.Item[6];
items[0] = new Opc.Da.Item();
items[0].ItemName = "[UX1]F20:9";
items[1] = new Opc.Da.Item();
items[1].ItemName = "[UX1]F22:30";
items[2] = new Opc.Da.Item();
items[2].ItemName = "[UX1]F22:6";
items[3] = new Opc.Da.Item();
items[3].ItemName = "[UX1]F18:8";
items[4] = new Opc.Da.Item();
items[4].ItemName = "[UX1]F22:32";
items[5] = new Opc.Da.Item();
items[5].ItemName = "[UX1]F22:5";
items = group.AddItems(items);
group.DataChanged += new Opc.Da.DataChangedEventHandler(OnTransactionCompleted);
}
static void OnTransactionCompleted(object group, object hReq, Opc.Da.ItemValueResult[] items)
{
Console.WriteLine("------------------->");
Console.WriteLine("DataChanged ...");
for (int i = 0; i < items.GetLength(0); i++)
{
Console.WriteLine("Item DataChange - ItemId: {0}", items[i].ItemName);
Console.WriteLine(" Value: {0,-20}", items[i].Value);
Console.WriteLine(" TimeStamp: {0:00}:{1:00}:{2:00}.{3:000}",
items[i].Timestamp.Hour,
items[i].Timestamp.Minute,
items[i].Timestamp.Second,
items[i].Timestamp.Millisecond);
}
Console.WriteLine("-------------------<");
}
Вот приложение WinForm
public Form1()
{
InitializeComponent();
_Form1 = this;
}
public static Form1 _Form1;
public void update(string message)
{
this.richTextBox1.Text = message;
}
private void Form1_Load(object sender, EventArgs e)
{
readplc();
}
static void readplc()
{
Opc.URL url = new Opc.URL("opcda://localhost/RSLinx OPC Server");
Opc.Da.Server server = null;
OpcCom.Factory fact = new OpcCom.Factory();
server = new Opc.Da.Server(fact, null);
server.Connect(url, new Opc.ConnectData(new System.Net.NetworkCredential()));
// Create a group
Opc.Da.Subscription group;
Opc.Da.SubscriptionState groupState = new Opc.Da.SubscriptionState();
groupState.Name = "Group";
groupState.Active = true;
group = (Opc.Da.Subscription)server.CreateSubscription(groupState);
// add items to the group.
Opc.Da.Item[] items = new Opc.Da.Item[6];
items[0] = new Opc.Da.Item();
items[0].ItemName = "[UX1]F20:9";
items[1] = new Opc.Da.Item();
items[1].ItemName = "[UX1]F22:30";
items[2] = new Opc.Da.Item();
items[2].ItemName = "[UX1]F22:6";
items[3] = new Opc.Da.Item();
items[3].ItemName = "[UX1]F18:8";
items[4] = new Opc.Da.Item();
items[4].ItemName = "[UX1]F22:32";
items[5] = new Opc.Da.Item();
items[5].ItemName = "[UX1]F22:5";
items = group.AddItems(items);
group.DataChanged += new Opc.Da.DataChangedEventHandler(OnTransactionCompleted);
}
static void OnTransactionCompleted(object group, object hReq, Opc.Da.ItemValueResult[] items)
{
for (int i = 0; i < items.GetLength(0); i++)
{
UIUpdater TEXT = new UIUpdater();
TEXT.UpdateText(items.GetLength(0).ToString() + " t " + i.ToString() + "Item DataChange - ItemId:" + items[i].ItemName +
"Value: " + items[i].Value + " TimeStamp: " + items[i].Timestamp.Hour + ":" +
items[i].Timestamp.Minute + ":" + items[i].Timestamp.Second + ":" + items[i].Timestamp.Millisecond);
}
}
UIUpdate Класс
class UIUpdater
{
public void UpdateText(string DATA)
{
Form1._Form1.update(DATA);
}
public class UpdateUI
{
public int updatedRows { get; set; }
public string Custom1 { get; set; }
public string Custom2 { get; set; }
public string Custom3 { get; set; }
public string exception { get; set; }
public plcTextStatus PLCStatus { get; set; }
}
Любые вопросы, пожалуйста, спросите!
Что такое 'UIUpdater'? –
Просто класс для обновления UserInterface Thread – SK2017
Можете ли вы опубликовать код для него? Это похоже на проблему с перекрестной резьбой. Я разработал множество приложений, использующих OPC самостоятельно, RSLinx довольно устойчив, похоже, что вы подключаетесь к Micrologix или SLC, или что-то вроде эпохи PLC5 ... –