設備監視項目


モニタリング基準は、1日24時を起点として、設備稼働費の稼働時間を表示する.
デバイスデータを格納し、デバイスモードとテーブルを作成し、デバイスデータを格納した後、そのモードから記憶値を取得して監視するプログラム.
このプロジェクトの例外部分:クライアントにはビジネスロジックが含まれています.
(クライアントは元のサーバで加工されたデータを表示するだけで......)
このプロジェクトには少し時間がかかりました.
コードをあまり書かず、データの加工に多くの時間を費やし、設備の運行時間計算ロジックを処理しました.
加えて、クライアント開発の過程で、設備の通信アウトソーシングを担当する企業は、設備の正常なデータを受け取っていないため、業務ロジックを修正したり、列データを変更したりするなど多くの問題がある.
つまり、ビジネスロジックがクライアントに導入されると、次のような問題が発生します.
そのクライアントプログラムが複数のコンピュータにインストールされて実行されると、
クライアントの実行により、サーバからデータがロードされる時点が異なるため、すべてのクライアントが同じ結果を同時に得ることはできません.
すなわち,現場A,現場Bでそのプログラムを回すと,異なるデータが見られる.

デバイスデータ稼働率


現在時刻:2010-12-01 13:10:23


現場Aクライアント1(192.168.0.5)
デバイスデータa:36%
デバイスデータb:20
デバイスデータc:10%
現場Bクライアント2(192.168.0.7)
デバイスデータa:35%
デバイスデータb:17
デバイスデータc:10%
このように監視画面に表示されます...
ではこれはリアルタイムではありません
クライアントには、複雑なsql関数を含むクエリー文(UTC時間の変更、今日のみのクエリーなど)が含まれています.デバイスデータはN時間(秒)ごとにロードされ、ロード速度も遅い.
これらのビジネスロジックは、サーバ上で処理する必要があることを担当者に通知しました.
このアイテムは異なるモード(?)を使用するため
現在のサーバで使用されているプラットフォームでは、低論理(?)を処理できないというわけではありません.
これは奇妙なプロジェクトで、論理処理部分をクライアントに渡しました.
設備事業者側の時間関連データが累積時間しか与えられないのもおかしい...
つまり、機器は初回稼働時間からの累積時間データしか入力できないため、この値を用いて機器の今日1日の稼働時間と非稼働時間を求める必要がある.
起動時間を取得する前に、まずデバイスにクエリー文を送信してデータを取得します.
設備表に格納されている設備をリストに列挙する.以降,各デバイスのデバイスデータを取得するためには,クエリ文を発行する必要がある.
デバイスデータはUTC時間で格納されるため、ローカルに表示する必要があるsqlクエリ文を追加する必要があります.



string _sQueryLog = 
$"select DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), GETDATE()), 
{DefineConstants.테이블명}.ncdatetime) 
AS ncdatetimelocal, * from {DefineConstants.테이블명} 
where {_sConvertedDateTimeFieldLogQuery} 
between CONVERT(datetime,'{_dtNow.Date.ToString("yyyy-MM-dd 00:00:00", 
System.Globalization.CultureInfo.InvariantCulture)}') 
and CONVERT(datetime,'{_dtNow.Date.ToString("yyyy-MM-dd 23:59:59", 
System.Globalization.CultureInfo.InvariantCulture)}') 
and nccode='{_keyValuePairMachine.Key}' 
ORDER BY ncdatetime desc";

// 변환된 결과:
select DATEADD(MINUTE, DATEDIFF(MINUTE, GETUTCDATE(), GETDATE()), 
테이블명.ncdatetime) 
AS ncdatetimelocal, * from 테이블명 
where CONVERT(datetime, 
SWITCHOFFSET(CONVERT(datetimeoffset, 
테이블명.ncdatetime), 
DATENAME(TzOffset, SYSDATETIMEOFFSET()) )) 
between CONVERT(datetime,'2021-02-09 00:00:00') 
and CONVERT(datetime,'2021-02-09 23:59:59') 
and nccode='설비코드' 
ORDER BY ncdatetime desc
.
.
.

// 다른 테이블의 데이터를 가져오는 비슷한 쿼리가 또 있다.
.
.
.
.
まずsqlクエリ文で各デバイスの今日のすべてのデータを取得し、ループを使用してデバイスの累積時間rowを取得します.
デバイス使用時間を求める方法は、1行の積算時間と2行の積算時間を減算して使用時間を得ることで、2つの値から差分値を求めた後、結果をタイムスタンプに変換します.
累積時間値をダブルに変換し、秒値を求める.秒値をTimespanに変換します.
プレイヤーが設定したN時間ごとに画面をリフレッシュします.
上記のクエリは、リフレッシュのたびに実行され、サーバに登録されている最新のデータを取得します.

デバイスコントロールは、サーバに登録されているデバイスの数に応じて生成され、画面に表示されるデバイスの数を超え、次のページに残りのデバイスが表示されます.