PLCタグの値が変わるたびに、その値をPLCから読み込んでフォームに表示する必要があります。C#でPLCのタグデータを呼び出す
私が監視する必要があるタグのリストがあります。 TAG値が変わるたびに、関数を呼び出す必要があります(各タグごとに異なる関数)。
これは私がこれまでのタグ値の変更をキャプチャするためのやっていること..です
PLCに接続した後、私はタグのリストを作成するでしょう。
タイマーのTAG値を読み取ります。
OLDVALUESタグで調べると、値に変化があればイベントが発生します。
これは、4つまたは5つのタグで正常に動作しています。タグの数が多い場合、私はタグのリストを追加するでしょう。これは、これまでのところ、私がやっていることである
..タグの変更イベントの一部が発射されていない、public delegate void DataChangedEventHandler(string TagName, string NewValue);
private Timer tmr = new Timer();
public event DataChangedEventHandler OnDataChanged;
private void StartTimer(DataTable dt)
{
AddTagList(dt);
SetInitialVales();
tmr.Tick += timerticks;
tmr.Interval = 250;
tmr.Enabled = true;
tmr.Start();
}
private void StopTimer()
{
tmr.Enabled = false;
tmr.Stop();
}
を100と言います。
private List<string> TagValues = new List<string>();
private List<string> oldValues = new List<string>();
private List<string> newValues = new List<string>();
private void AddTagList(DataTable dt)
{
int ILoop = 0;
foreach (DataRow row in dt.Rows)
{
TagValues.Add((string)row["Path"]);
ILoop = ILoop + 1;
}
}
タグの初期値を設定します。
private void SetInitialVales()
{
int iLoop = 0;
foreach (string vals in TagValues)
{
var rd = ReadTag(vals);
oldValues.Add(rd.ToString());
newValues.Add(rd.ToString());
iLoop = iLoop + 1;
}
//newValues = oldValues
}
とメインデータ部分。
private void timerticks(object sender, EventArgs eventArgs)
{
int iLoop = 0;
foreach (string vals in TagValues)
{
oldValues[iLoop] = ReadTag(vals).ToString();
if (oldValues[iLoop] != newValues[iLoop])
{
newValues[iLoop] = oldValues[iLoop];
if (OnDataChanged != null)
{
OnDataChanged(vals, newValues[iLoop]);
}
}
iLoop = iLoop + 1;
}
}
マイクエリ:すでに提起イベントは(サブ手順が完了していない)進行中にイベントが発生した場合
1.Whatが起こるのだろう?この理由のために私はいくつかのdatachangeイベントがありませんか?
2.LIST値のメンバが変更されるたびに自動的にイベントを発生させる方法はありますか?
3.他のより良い方法は、タイマー読み取りraiseeventを処理するには?
タグが250ミリ秒未満でオン/オフするとどうなるかを想像してみてください。 –
ありがとうございます。私たちは世話をしました。どんなタグもそのような振る舞いはありません。 – Olivarsham
これは珍しいことです。彼らは何のように行動するのですか?それらは1秒間保証されますか?タグがたくさんあるときにコードが1秒以上かかるとどうなりますか?それとも、コードがどれくらい時間がかかっても、タグがオンになっていると常に見えるようにラッチされていますか? –