Web SCADAプラットフォームをベースとしたデジタルワークショップのMESシステムを構築

       デジタル工房のMESシステムと情報システム(ERP、CRM、SRMなどの最大の違いは、システムは経営情報化におけるデータの遅れが大きく、その管理も後回しであることです。・次回同じ問題が起こらないよう事実管理を行う。

      自動化機器の普及により、これまで交わることのなかった情報化と産業オートメーションが自然に融合し、私たちの業界で普及している「工業化と工業化の融合」が、生産企業のコストの90%を占めています。工場をコントロールするということは、コストの9割をコントロールすることに相当し、データを取得し、工程、品質、人員、材料などのコストに影響を与える要因をデータ分析によって明らかにすることが、さまざまな企業の取り組みの方向性となっている。一言で言えば、「前世紀の良い企業はIT技術を使いこなす必要があり、今の時代は良い企業はDATA技術を使いこなす必要がある」ということからも、企業にとってのデータの重要性が分かります。将来の企業では、それを使用するかどうかに関係なく、おそらく短期間で合格できるでしょう豊富な経験がこの欠点を補いますが、将来彼女なしではやっていけないでしょう。データを企業に提供する 従来の経営情報 企業は人を管理し、人の行動を管理する 将来はあなたが企業を管理する 本体は徐々にロボットになる 企業にとって、リアルタイムデータは最も効果的な方法です企業のコストを最小限に抑え、製品の品質を向上させる リアルタイムのデータと管理情報化に基づいて最良の状況を事前に予測管理することにより、製品の問題、品質、プロセスなどを事前に修正します。

      データのソースは作業場レベルで、装置に最も近いシステムは現在SCADAシステムですが、いつか自動化と情報技術がさらに統合されない限り、それが現在話題になっているデジタルツインになるかどうかはわかりません. システム全体だけが企業にとって最良の状態であるため、ツインは全体を意味するわけではありません。

      MESシステムに関しては、リアルタイムデータに基づいてリアルタイムに意思決定を行うことが基本であると私は理解していますが、従来のCSベースのSCADAは、どちらかというと設備層や作業場層に重点が置かれており、それとは乖離しています。物流部門の最初の定義は、管理および制御テクノロジーの存在であり、管理情報化とうまく統合することはできません。この 2 つを統合しても、ワークショップだけでは企業全体の効率を向上させることができないことに誰もが気づきます。ロジスティクスに関係なく、無視されます。ワークショップと他の部門の間でリアルタイムにアップロードおよび配布すると、一連の問題とコスト損失が発生します。できることは事後分析だけです。管理ニーズに基づいて、ワークショップレベルのデータが作成されます。物流管理部門とリアルタイムで通信する必要がある 物流部門と工場の役割間の効率的な連携を実現するための管理システムとのリアルタイムの対話 現在の設備の自動化とさまざまな電子機器やメーターの普及率に基づいて、上記を達成することはもはや難しいことではありませんが、残るは管理概念(プロセス管理)の変更かもしれません

    ここまで多くのことを述べてきましたが、次に、リアルタイム データが管理とどのように組み合わされるかを示す実際的なケースを示します。

  • 建設の背景:

      オーブンは、製薬衛生、電子部品の乾燥、工業および農業、ゴム機械、大学や科学研究部の生産作業場や研究室など、さまざまな業界で広く使用されており、オーブンの国内市場シェアは徐々に増加しています。従来の国内市場のオーブン機器はもちろん、主要な国際市場のオーブン機器も基本的に中国製であることがわかり、中国におけるオーブン機器の輸入中心の歴史が終わったことを示しています。中国一般機械オーブン装置産業協会による今後数年間の中国の需要予測によれば、化学業界におけるオーブン装置の年間需要は約3万台(セット)に達すると予想されている。医薬品乾燥炉設備の年間需要は、農業、林業、食品向けに約30,000台(セット)に達すると予想されています。軽工業などのオーブン機器の年間需要は約5万台(セット)に達します。現在、オーブン装置は国内市場の80%以上を占めています。技術の発展と自動化のさらなる革新に伴い、さまざまな産業におけるオーブン装置の使用も絶えず発展しており、オーブンは我が国の関連産業で広く使用されており、大幅に開発、改良されています。しかし、オーブンのデータや制御管理にはまだいくつかの問題があります。

  (1) データはリアルタイムで送信され、制御と現場のオーブン機器の間の連携は高くありません。

  (2) データの送信と対話には通信障壁があります。

  (3) 経営監視システムが古すぎる。

  • 建設の意味:

       現在、我が国のほとんどの産業におけるオーブンの生産と応用は、基本的にマンマシン相互コミュニケーションの管理モードを実現していますが、体系的な技術指導の欠如により、実際の応用には多くの障害が生じています。産業の近代化のプロセスに広範な影響を及ぼします。IGX オーブン管理システムは、マンマシンコミュニケーション、情報伝達、インテリジェントなタスク管理の改善、産業構造調整の促進に重要な役割を果たしており、インテリジェントな管理は工業生産において重要な役割を果たしています。高レベル・高効率の工業生産や製品人材管理を実現するためには、情報取得手段は最も重要なキーテクノロジーの一つです。モノのインターネット情報技術は、産業分野で広範囲に応用されています。工業製品生産のさまざまな段階の観点から見ると、原材料の入手、製造、完成の各段階に関係なく、モノのインターネットのテクノロジーを使用して、作業の効率を向上させ、洗練された管理を行うことができます。IGXオーブン監視制御システムは、生産管理の効率を大幅に向上させ、省力化を実現します(例えば、大規模工場の場合、数千台のオーブンを手動で検査し、手動で加熱/冷却し、データを記録するなどの作業負荷が軽減されます)。非常に大きくて管理が難しい(IGX オーブン監視制御システムを適用すると、手動制御はマウスの小さな動きをクリックするだけで済み、その前後にわずか数秒しかかからず、面倒な手動操作が完全に置き換えられます)フィールド調査などの分野で強力な科学データ理論のサポートを提供し、今日の高度に自動化されたインテリジェント社会においてその役割は自明です。最新の産業技術の応用と促進の拠点として、産業デモンストレーションパークは、現代の産業技術を集中的に表現し、現代の情報技術を産業に初めて応用したものです。

  • 企業の生産性を向上させる

       オーブンデータ情報を正確かつリアルタイムに取得し、完全なデータ配信と管理を行い、情報伝達の壁を突破し、いつでもどこでも機器とのバリアフリー通信を実現します。現在、旧世代のオーブン監視管理システムはデータ収集とリアルタイム制御が不完全で、いつでもどこでもアクセスを完了できません。システム整合性の利用率は 50% 未満であり、IGX オーブン監視および管理システムのデータ収集と制御は正確かつリアルタイムであり、オーブン タスクのエラー率の発生を減らし、生産歩留まりを最高レベルに高めることができます。 、より高い生産能力を獲得します。

  • タスクの精度を向上させる

       オーブン内のすべての製品がすべてのタスクです。タスクでは、正確なボックスイン時間が傍受され、正しいボックスアウト時間が計算され、ボックスアウト警告リマインダーが設定され、ボックスが時間内にリリースされ、新しいタスクが行われます。中間の人為的ミスを減らすために、適切なタイミングで展開されます。 オーブンデータはリアルタイムで正確に表示され、信頼性の高いカーブデータ、レポートデータ、アラームデータが得られ、その精度の高さから学術研究価値が極めて高く、現代の産業プロセスの推進に一役買っています。

  • 全体的なシステムアーキテクチャ
オーブン管理システムの全体構造

       IGX オーブン監視および管理システムの全体的なソリューションは、主に 3 つの部分で構成されています。SCADA 情報の収集と自動制御、機器と人員の管理、および MES インテリジェントなタスク処理です。情報収集と制御には、オーブンリアルタイム温度監視、オーブン目標温度監視、オーブン温度上限マージン監視、オーブン下限マージン監視などが含まれます。装置制御には、オーブン目標温度制御、オーブン温度上限マージン制御、オーブン起動停止制御などが含まれます。情報公開やデータ処理には、情報センターの管理基盤や携帯電話による警報情報の警報処理などの機能が含まれます。

  •  リアルタイム監視モジュール

       このモジュールはオーブンに付属の各種温度コントローラーと温度センサーを中心に構成されており、温度をリアルタイムに監視し、PIDにより設定温度値に制御します。 

  • 取得および送信モジュール

      取得および送信モジュールは、(WEB SCADA) 社の DIOT 8500 システムの MQTT ゲートウェイによって完成され、ゲートウェイは MQTT モノのインターネット プロトコルをサポートし、GPRS 送信、WIFI 無線送信、3G/4G 送信および有線ブロードバンドをサポートします 

  • アッパープラットフォームシステム

      ホストプラットフォームシステムはECAVA社のIntegraXorTM SCADA(  WEB SCADA)プロフェッショナル版B/Sアーキテクチャ構成ソフトウェアで、世界60カ国以上の数万箇所の設置ポイントに導入されています。このソフトウェアは、最も軽量、最速、最も安定性、最も安全な情報ベースの IoT システムであり、Android、Apple、LIUNX、および Windows システムを搭載した携帯電話、タブレット、PC、スマート TV、および大画面をサポートしています。このシステムは、ローカル、リモート、またはクラウド サーバーに展開できますが、同時に、その拡張性、柔軟性、二次開発のサポートにより、IGX の存在により、第一に、そのプラットフォーム上で二次開発を実行して、より強力な開発を実現できます。第 2 に、標準データ インターフェイスを通じて、ERP、MES、およびリアルタイム データ接続用の他の管理システムなどの他のサードパーティ管理システムにデータを接続できます。これは企業情報化の中核です。複数のシステムが存在する可能性があります。 、しかし、それらは完全なビジネスプロセスに基づいている必要があります。ビジネスプロセスはリアルタイムで開かれているため、期間が全体になります。

  • オーブンリアルタイム監視システム

     オーブンリアルタイム監視システムは、「リアルタイム監視」、「通信監視」、「曲線管理」、「レポート管理」、「アラーム管理」およびその他の機能モジュールに分かれています。 

  • オーブンエリアの概要
オーブンエリアの概要

老化研究室

 各グリッドはオーブンの位置を表します。実際のサイト構成によれば、合計 62 個のオーブンがあります。[タスク管理] 
ボタンをクリックして MES タスク管理インターフェイスに入ります。[レポート]ボタンをクリックしてリアルタイム オーブンにジャンプします。温度レポートインターフェース; 「曲線」ボタンをクリックすると、リアルタイムオーブン温度曲線インターフェースにジャンプします; 「アラーム」ボタンをクリックすると、リアルタイムオーブン温度アラームインターフェースにジャンプします; 「換気老化ボックス」ボタンをクリックしてジャンプします6 つの換気老化ボックスのインターフェイスの監視に移動します。「手動」ボタンをクリックしてオーブン監視および管理システムの操作マニュアルを開きます。このインターフェイスには、「温度超過アラーム」と「温度未満アラーム」の点滅プロンプトがあります。





  赤点滅「温度超過警報」、黄色点滅「温度低下警報」

  •  独立したオーブン操作インターフェイス

      現在のシステムを表示できます: 「過熱アラーム」、「温度低下アラーム」、および「通信アラーム」 システムアラームの場合: 各ページに最新の 2 つのアラーム記録が表示されます;
     リアルタイムアラーム:アラームが発生したとき、および設定したトリガー条件が満たされると、画面の下部に赤いアラートが表示されます。

アラームの確認:ユーザーがログイン後、クリックしてアラームを確認すると、アラーム情報がオレンジ色で表示され、確認者と確認時間が表示されます。

     履歴アラーム:まず、確認されたアラーム情報を履歴アラームに表示でき、確認者情報と確認時刻が表示され、次に、アラームのトリガー条件が満たされない場合、このアラーム情報は自動的に履歴アラームに含まれます。
     アラームをキャンセルする:対応するアラーム インターフェイスで、[設定] をクリックして必要なアラーム情報を確認し、不要なアラーム情報を確認する必要はありません。 

  •  オーブン温度曲線の監視
タイトル オーブン温度プロファイル監視
  • オーブンカーブ確認方法 

 オーブンのリアルタイム (履歴) 温度曲線をチェックして、実験者が必要とする複数のセットのオーブン データ曲線を表示できます。

オーブンカーブ確認方法

  • オーブンカーブインターフェイスの具体的な操作  
オーブンカーブインターフェイスの具体的な操作

出力(.csvデータテーブル形式)

  オーブン温度レポート管理

オーブン温度レポート管理

オーブン温度レポート表示

温度データ履歴をクエリするには、[開く] をクリックして期間を選択します。 

オーブン温度レポート履歴クエリ

  • オーブン温度レポート履歴データのエクスポート

温度レポートは「.csv」形式でエクスポートできます。「エクスポート」をクリックしてダウンロードします。

  •   オーブンのアラーム管理

       フィールドデータをリアルタイムに収集・判定し、「過熱警報」温度低下警報」通信警報」の3つの警報形式を出力し、IGX Webページ上の警報表示を4つに分けて表示します。表示インターフェース: 「すべてのアラーム」、「過熱アラーム」、「温度不足アラーム」、「通信アラーム」。ログイン後、ユーザーはアラーム(緑色)、アラーム(赤色)、ユーザー確認(オレンジ色)を確認できます。 )。左上の対応する単語をクリックすると、アラーム情報を印刷、エクスポート、選択 (つまり、フィルタリング) できます。

すべてのアラーム

通信アラーム
  • オーブンのタスク管理 
MESシステムの枠組み

 オーブンタスク管理システムには、「実験計画の取得」、「実験タスクの作成」、「リアルタイムタスクリスト」、「履歴タスクリスト」、「履歴レポート」の機能が含まれています。

  •  実験計画を取得する

    IGXは、情報センターの処理に必要な各種データを「Product Lifecycle Management PLM」システムから取得します。現在のページを開くとデフォルトでその日のタスクプランが表示され、「Get Application Form」をクリックするとIGXサーバーからタスクプランを取得できます。

 クエリ機能:「サンプル番号」「ゴム名」「日付間隔」により、当日または過去の実験計画をクエリできます。
 エラー防止機能:現在ログインしているユーザは自分の実験計画しか取得できず、他のオペレータタスクに申請すると無効である旨のメッセージが表示されます。
 クイッククエリ機能:「実験者」のドロップダウンメニューで実験者を選択すると、オペレーターのすべての実験計画を迅速にクエリできます。
 

  •  実験タスクの作成

           この機能モジュールは、取得された実験計画を通じて実験タスクを生成します。「サンプル番号(委託番号)」、「ゴム材料名」、「実験項目」、「オーブン」、「温度」、「実験時間」、「備考」を選択または入力し、「実験タスク作成」ボタンをクリックしてください。実験タスクを生成します[受信箱] を 1 つずつクリックするか、[すべて受信箱] を一度にクリックして、実験的なタスクのボックス化を完了します。これは、[リアルタイム タスク]ページで監視できます。

自動入力機能:オペレーターが「サンプルNo.(委託No.)」を選択すると、「サンプルNo.(委託No.)」「ゴム名」「実験項目」を自動で入力し、入力するだけで完了します。オペレーターに確認していただくか、若干の修正を行う場合がございます。

 スマート検索機能:オーブンを選択する際、温度値またはオーブン番号を入力することで、対応するオーブンをすばやく検索できます。図に示すように:

 エラー防止機能:現在ログインしているオペレータは、自身の実験計画に対する実験タスクの生成のみが可能であり、自身の実験タスクに対するボックスイン操作のみが可能です。

 クイックスクリーニング機能:ページ上の「自分の実験タスクのみを表示」ボタンをクリックすると、自分の実験タスクを素早く照会でき、業務効率が向上します。以下に示すように:

 ボクシング時間の自動記録機能:オペレーターが面倒なボクシング時間を入力または選択する必要はありません。「ボクシング」または「すべてのボクシング」ボタンをクリックすると、システムが自動的にボクシング時間を記録し、エラーを防止し、改善します。正確さと作業効率。これは、情報化と自動化を反映した融合ポイントです。現在時刻が収集されていない場合、従来の方法では、オペレーターがボックスに入った後に現在時刻を記録する必要があります。このプロセスには時間がかかり、不正確なデータ記録が発生します。重要な問題は、ビジネスプロセスのニーズに基づいて、このボックスインアクションが、生産計画、生産進捗状況、生産日報、リアルタイムの出来高払い賃金の更新などの一連の管理要件を満たせないことです。

  •  リアルタイムタスクリスト

        上のインターフェイスには、テスト中のすべてのアイテムが表示されます。実験アイテムはオーブン番号に従って順番に配置されます (オーブン内の実験アイテムの数を観察できます)。実験が完了したら、画面の「」をクリックします。 「ボックス」ボタンをクリックして実験タスクを完了します。」履歴データをクエリします。


 箱から出してすぐのリマインダー機能:箱から出してから 20 分が経過すると、実験の 1 つの記録に「赤色」の背景リマインダーが表示され、実験時間が経過すると、1 つの実験記録に「赤」の背景リマインダーが表示されます。 「黄色」の背景リマインダー。
 エラー防止機能 1:現在ログインしているユーザは、自身の実験タスクの変更またはアウトオブボックス操作のみを実行でき、他のオペレータタスクを操作する場合、権限不足のプロンプトが表示されます。
 エラー防止機能 2:返却期限が過ぎている場合、誤って「箱から出す」ボタンをクリックすると、システムが自動的に「返却期限が来ていません」というメッセージを表示し、操作は承認されません。
 クイック選択機能:「People into the Box」のドロップダウンメニューを選択すると、関連する実験タスクが素早く表示され、効率が向上します。
 3 つの変更機能:テスト対象のタスクでも、図に示すように 3 番目の変更機能を実行できます。

また、システムは変更内容に応じて「開封時間」「残り分」を自動的に計算します。 

 出荷時時間の自動記録機能:出荷時時間と同様に、「出荷時」ボタンをクリックすると、システムはプロセス要件が満たされているかどうかを優先的に判断します。工程が要求する工程範囲内であれば、ボックスの時間を自動的に記録し、ミスを防ぎ、精度と作業効率を向上させます。

  •  過去のタスクリスト 

       すべての履歴タスクが上のページに表示され、当日の履歴実験タスクがデフォルトで表示されます。タスクに対応する「レポートを開く」ボタンをクリックして、この実験タスクの特定のデータおよび履歴温度レポートを開きます。

  • 履歴タスクレポート

       上記の履歴タスク レポートは、このタスクの関連データを詳細にクエリしており、データ トレース用にエクスポートまたは印刷することができます。リアルタイム プロセス データを効果的に関連付け、製品の特定のバッチを製品の品質に影響を与えるリアルタイム データと結び付けます。品質とプロセスのトレーサビリティの全プロセスを効果的に実現し、企業が製品の品質に影響を与える特定の理由を見つけ出すのを支援し、生産プロセスをさらに改善および最適化し、企業のコスト削減と効率の向上という目標を達成します。

  •  モバイルアクセスおよび権利管理システム

       このシステムは、携帯電話、タブレット、PC、スマート TV、Android、Apple、Linux、Windows、その他のシステムの大画面へのアクセスをサポートしており、ベクトルによってズームインまたはズームアウトすることができます。
オペレーターや関係者はLANやインターネット経由でアクセスすることができ、いつでもどこでも実験状況を把握でき、作業の効率化が図れます。携帯電話からのアクセスは次のようになります。 

モバイル端末の監視効果

モバイル端末の監視効果

        上記は、オーブン デジタル ワークショップ MES システム全体の中核となるビジネス機能であり、計画されたタスクの管理、リアルタイム タスクのプロセス監視、アウトオブボックスおよびインボックスの管理、毎日の分析データのリアルタイム生成が含まれます。管理に必要なレポートを作成し、その機能を実現 生産計画の作成、生産作業指示の発行、生産作業指示に基づく作業者の主導、管理まで、ERPとMESシステムを組み合わせた機能のほとんどを実現材料のピッキングと送信、生産プロセスのモニタリング、プロセスのリアルタイムデータ収集、完了レポート、品質検査(インターフェースを介して現在の製品PLMのプロセス要件を読み取り、収集されたデータを比較および分析) SCADAによりリアルタイムで工程を満たさない場合はアラームが発せられ、作業場内の3色のライトも音と光でアラーム)、完成品の保管など生産カンバンと連携し、 SCADAのリアルタイムデータ収集と監視に基づいてワークショップのデジタル化を実現する倉庫資材の準備と配送かんばん、プロセス全体で重要なデータの自動収集、データに基づく次のプロセスの自動トリガー、およびリアルタイム更新対応を実現します。ビジネスノード、生産​​計画、生産作業指示、品質データ、かんばんデータは、物流管理部門と生産工場、倉庫、品質などの部門間のビジネスプロセスに基づくリアルタイムのコラボレーションシナリオを実現します。

以下では、IGX Web SCADA プラットフォーム ( Ecava_IGX  /  Ecava WEB SCADA )        に基づいて 、最下層で収集された機器データをフロントエンドおよびバックエンドと論理的に接続する方法を説明し、個人や企業にいくつかのアイデアを提供します。同様のニーズを持つ企業。

       まず、IGX Web 構成プラットフォーム ( Ecava_IGX  /  Ecava WEB SCADA  ) は設計時と実行時に分けられ、IGX は設計時の C/S アーキテクチャです (一部のアプリケーション シナリオでは C/S アーキテクチャが依然として絶対的な利点を持っています)。 IGX プロジェクト エディターで編集されるプロジェクト構造は、管理システムのフロントエンド プロジェクトに似ています (詳細は次の表を参照)。リリースされた WEB 構成プラットフォームは、C/S アーキテクチャ プラットフォームを通じて設計および構成されます。 、パートナーは独自のフロントエンドおよびバックエンド開発機能を使用して、ビジネス ロジックに基づいて詳細なカスタマイズされた開発を実施し、個別のニーズを満たすこともできます。

IGX プロジェクト ファイル構造
シリアルナンバー 構造の内容 説明する
1 キャッシュ IGX 動作中のデータ キャッシュ
2 画像 フロントエンド プロジェクトと一致し、写真やその他のファイルを保存するために使用されます。
3 ラング 言語プロファイル。
4 メディア メディアファイル
5 プラグイン Bootstrap、ThreeJS、JQuery などのさまざまなサードパーティ JS プラグイン パッケージ。
6 スクリプト スクリプトファイル
7 スタイル スタイルファイル
8 *.igx IGX プロジェクト操作ファイル
9 *.html ページを表示する
10 *.svg 上記の表示ページと同じで、データとグラフィックをバインドするために使用されます。
11 *.* その他のファイル その他の設定ファイルなど

       IGX には、独自の Web サーバーと組み込みの GoogleV8 スクリプト エンジンが付属しています。プロジェクト プロジェクト ファイルがリリースされると、プロジェクト エディターで直接実行して公開できます。Web SCADA (WEB SCADA) 実行エンジンは、次のようなさまざまなサービスを統合し ます 。市場の80%と互換性 上記一般データプロトコル、IOポイント収集サービス、IOドライバーサービス、スクリプトスクリプトサービス、ゲートウェイサービス、Webサーバー、クラスターサービス、冗長化サービス、アラームサービス、レポートサービス、SNMPエージェントサービス、ログ、つまり、IGX は、単純なドラッグ アンド ドロップ モードによる開発をサポートし、複雑なスクリプト ロジックの開発もサポートし、同時にリリースして実行する必要がなく、ワンクリックで実行できます。追加の構成。

  • フロントエンドの開発とサポート:

 IGX Web SCADA ( WEB SCADA ) も厳密にはフロントエンドとバックエンドに分かれており、フロントエンドはJavaScriptスクリプト、DOM、CSS、AJAX、JSON、WebServicesなどの最新のWEB技術を通じて拡張・開発されます。システム       管理 IGX は、最下層で収集されたデータを JS パッケージ ( igrX2.js) にカプセル化しています。パートナーは、次のように、現在のファイルをページに直接参照できます。

<script type='text/javascript'src='system/scripts/igrX2.js'></script>

 JS パッケージが参照された後、標準の JavaScript 関数に加えて、パートナーは GetTag('TagName') および SetTag('TagName', val, option) に基づいてリアルタイムのデバイス データを取得し、読み取りおよび書き込み可能な IO 操作を設定できます。 Value など。SetTag はオプションのパラメータを受け入れ、データベース ログの目的で仮想タグのタイムスタンプを変更できるようにします。setTag('tag', data, option); ここで、option は JavaScript Date() を受け入れる時間項目を持つ JSON オブジェクトです。完全な例は、次のコード スニペットで見ることができます。

次のように getTag を実行します。

// SetTag 获取标签数据
var S1 = getTag('SIM1_Lek');
var S2 = getTag('SIM1_Breuk');
var S3 = getTag('SIM1_Service');
var S4 = getTag('SIM1_Loopim');

次のようにタグを設定します。

// 给数据标签设置数据 SetTag
 var opt = {
"time" : new Date(
            2020, //yyyy
            0, //M; 0: Jan, 1: Feb...
            1, //D
            1, //h
            2, //m
            3, //s
            456//msec
        )
};

setTag( "myTag", 123.45, opt);
  • デバッグ機能

      さらに多くの機能はサーバー側でのみ使用でき、主にデバッグ目的で使用されます。これらの関数は、デバッグ ボタンをクリックしてデバッグ モードをオンにする必要があります。タスク ウィンドウでスクリプトが選択されると、デバッグ情報がステータス ウィンドウに表示されます。

debugString(String)//用于将调试字符串发送到状态窗口。
debugTag(标记名)//只需打印标记名及其值到状态窗口。 

       デバッグ情報は、ステータス ウィンドウでピンク色のテキストでスクロールします。以下は、デバッグ機能を使用したトラブルシューティングを示すサンプル コードです。これをコピーしてスクリプト エントリに貼り付けて、プログラム フローを確認できます。 

高度基準インターフェース

  

//代码调试
var a = getTag( "tagA") || 1; //默认 value 1
var b = getTag( "tagB") || 2; //默认 value 2
var c = getTag( "tagC"); //没有默认值

if (c > 1000) {
    a = 1;
    b = 2;
}

a = a + 1;
setTag( "tagA", a);

b = b + 2;
setTag( "tagB", b);

c = a + b;
setTag( "tagC", c);

debugTag( "tagC"); //使用debugTag()调试.
debugString( "Script is successfully executed."); //debugString 只能在调试模式下使用

 getTag を通じてデータを取得した後、パートナーは対応する処理ロジックを開発のためにフロントエンドに追加できます。

  • バックエンドの開発とサポート - runSql() 関数

IGX Web SCADA (  WEB SCADA ) に保存される SQL ステートメントの詳細な説明は、保存される SQL 構成の構成の章を参照してください。保存されたステートメントの名前、実行する SQL ステートメント、および SQL パラメーター (存在する場合) をプロジェクト エディターで定義した後、フロントエンドからすぐにアクセスできます。次の式を使用して、保存された SQL ステートメントにアクセスします。

runSql(name, parameters, option, callback-function);

上記の式に基づいて 4 つのパラメータを渡します。
次の表は、runSql() 関数の各パラメータの役割を説明しています。

名前:
         名前は、プロジェクト エディターで指定された保存された SQL ステートメントの名前に対応する文字列値です。
        [重要]
         ご想像のとおり、名前は必須パラメーターであり、空白のままにすることはできません。
パラメータ:
        パラメータは、プロジェクト エディタで特定のステートメントに対して定義されたパラメータを指定する値です。パラメータは Javascript オブジェクトであり、JSON 構文に従う必要があります。

      [注意]
        プロジェクトエディタでパラメータを指定する際に使用する「@」記号は含めないでください。定義文に @table と val の 2 つのパラメータがあると仮定すると、param オブジェクトは次のように構築されます。

var param = {
    "table": "table value",
    "val": "val value"
};

オプション:
      オプションも Javascript オブジェクトであり、JSON 構文に従う必要があります。一時オプションには、outfmt (出力形式を表す) と dbgroup (データベース名) という 2 つのエントリがあります。outfmt は、ユーザーがサーバーに返すように要求する送信形式です
     。任意の SQL ステートメントの結果データ。outfmt は、json、csv、csvh、または xml の 4 つの値のいずれかを受け取ります。指定されていない場合、outfmt 値はデフォルトで csv になります。dbgroup では、データベースの名前を指定できます。 SQL ステートメントが実行される必要があります。これは、プロジェクト エディターで設定したものと同じである必要があります。「データベース」セクションで定義されたデータベースの名前が一致します。オプションで bgroup が指定されていない場合、デフォルト値の -1 が実行されます。これは、プロジェクト エディターで定義されたすべてのデータベースに対して SQL ステートメントを実行するようにサーバーに指示します。オプションを定義するには、次のように定義できます。

var opt = {
    "outfmt": "json",
    "dbgroup": "dbname"
};

// 或者你也可以像下面这样做:
var opt = {};

opt["outfmt"] = "json";
opt["dbgroup"] = "dbname";

コールバック関数:
        コールバック関数は、SQL ステートメントの実行時にサーバーから返された結果を処理する関数になります。サーバーが結果を返さない場合、コールバック関数はユーザーへの通知も行います。関数は事前に宣言できます。そして関数名をパラメータとして渡します。

var cbfn = function(result){
    //这是回调函数
    // result 是来自服务器的响应
};
runSql(name,parameters,options,cbfn);

あるいは、次のように、コールバック関数のパラメータを指定するときに匿名関数を宣言することもできます。

runSql(name,parameters,options,function(result){
    //这是回调函数
    // result 是来自服务器的响应
});

オーブン ケース コード分析 - オーブン プラン タスクを取得します。

<!DOCTYPE html>
<html>
<head>
	<title>列表</title>
	  <meta http-equiv="content-type" content="text/html; charset=utf-8"/>
    <script type="text/javascript" src="system/scripts/igrX.js"></script>
    <script type="text/javascript" src="system/scripts/igrX2.js"></script>

	<style type="text/css">	
		
	fieldset {width:80%; margin:auto; float: none;background-color: #F5F5F5; }
    #content-table-th{
     width:1328px;
     margin:auto;
     border:1px solid #aaa!important;
     background-color: #B1D2EC;
	}
	#content-table{
		width:1328px;
		text-align: center;
		margin:auto;
        border-spacing:0;
        border-collapse:collapse;
	}

	#content-table tr:nth-child(even){
		background-color: #ddd;
	}
	
	#content-table tr:nth-child(odd){
		background-color: #eee;
	}
	
	#content-table td{
		border:1px solid #aaa!important;
	}
 body{padding: 20px;}
  .demo-input{padding-left: 10px; height: 28px; min-width: 110px; line-height: 28px; border: 2px solid #e6e6e6; background: url(laydate/riqi.png) no-repeat;background-position:right; border-radius: 2px;}
  .demo-footer{padding: 50px 0; color: #999; font-size: 14px;}
  .demo-footer a{padding: 0 5px; color: #01AAED;}	
</style>
</head>
<body bgcolor="#FFFFFF">
   <div id="container">
     <center><fieldset style="width:1320px;" class="ui-widget-content"> 
          	 <div>
  	       &nbsp;样品编号:&nbsp;
  	          	<input type="text" style="width:145px; height:20px; font-size:16px" id="wt_num"  placeholder="请输入样品编号" autofocus="autofocus"></input>
  	        &nbsp;胶料名称:&nbsp;
             	  <input type="text" style="width:125px; height:20px; font-size:16px" id="sj_code" placeholder="请输入胶料名称" autofocus="autofocus"></input>
 	        &nbsp;&nbsp;实验员:&nbsp;
           	<select style="width:70px; height:25px;"  id="selStId" onchange="dotakeSt()">
                 <option value="0">---全部---</option>
                 <option value="wangb">王博</option>
                 <option value="chenk">陈开</option>
            </select> 
  	          	<input style="display:none" style="width:120px; height:25px;" type="text" readonly="readonly" id="takeSt_v"></input>
  	          	<input style="display:none" type="text" id="takeSt"></input> 
  	          	
           &nbsp;日期开始:&nbsp;
                <input type="text" class="demo-input" name="datep31" id="datep31" style="width:110px;font-size:95%;border-radius:5px;" autocomplete="off"/>  
            &nbsp;截止(当天)&nbsp;
                <input type="text" class="demo-input" name="datep32" id="datep32" style="width:110px;font-size:95%;border-radius:5px;" autocomplete="off"/> 
                &nbsp;
             	<input style="width:120px; height:30px;font-size:13px; border-radius:5px;" type="button" value="⇪&nbsp;查询最新申请单" onclick="searchTaskData()"/>&nbsp;
            </div> 
    </fieldset></center>
 </div>   
<table id="content-table-th">
<tr><th width="20px">序号</th><th width="120px">样品编号</th><th width="120px">胶料名称</th><th width="160px">实验项目</th><th width="100px">申请日期</th><th width="40px">周期</th><th width="60px">实验员</th><th width="90px">操作</th></tr>
</table>
<table id="content-table"> </table>
</body>
<script type="text/javascript"> 
	 var myTimer;
	 var param = {};
   function dotakeSt(){
  	var myselect=document.getElementById("selStId");
  	var index=myselect.selectedIndex ;
  	document.getElementById('takeSt').value=myselect.options[index].value;
  	document.getElementById('takeSt_v').value=myselect.options[index].text;
  }   
	function searchTaskData(){
      var txt="",i;
      var wt_num ="";
      wt_num = document.getElementById('wt_num').value;   
      var sj_code ="";
      sj_code = document.getElementById('sj_code').value; 
      var expCode ="";
      expCode = document.getElementById('takeSt').value;  
      if (expCode==0) expCode="";   
        	var sttime=document.getElementById ("datep31");
          var edtime=document.getElementById ("datep32");
          param["ts"] = sttime.value;
          param["ts2"] = edtime.value;
          param["wt_num"] = wt_num;     
          param["sj_code"] = sj_code;   
          param["expCode"] = expCode;  
         	var todo ="<a href='#' onclick='insertData(this)'>⇩获取申请单&nbsp;</a>&nbsp;"
          txt=txt + "";    
        	runSql("getjc_task", param, {outfmt:"json"}, function(result) {
					if (result.statusCode == 200) {
						var data = JSON.parse(result.response);
						for (var i in data){
							var j =i*1 + 1;  
							txt=txt + "<tr>"; 
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["wt_num"] + "</td>";
							txt=txt + "<td width='20px'>" + j + "</td>";
							txt=txt + "<td width='120px'>" + data[i]["wt_num"] + "</td>"; 
							txt=txt + "<td width='120px'>" + data[i]["sj_code"] + "</td>"; 
							txt=txt + "<td width='160px'>" + data[i]["sy_item"] + "</td>";	
              txt=txt + "<td width='100px'>" + data[i]["sysdate"] + "</td>";
							txt=txt + "<td width='40px'>"  + data[i]["days1"] + "</td>";
							txt=txt + "<td width='60px'>" + data[i]["expname"] + "</td>"; 
							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["sy_name"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["draw_no"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["sy_lot"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["sy_qty"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["sy_dept"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["applicantcode"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["applicantname"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["days2"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["comdate"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["findate"] + "</td>";														
							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["appfindate"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["fee"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["expcode"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["keep"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["memo"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["stage"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["flag"] + "</td>";														
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["pcode"] + "</td>";							
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["ypcfdate"] + "</td>";																																										
							txt=txt + "<td style=" + '"display:none"'+">" + data[i]["ypcldate"] + "</td>";																																																	
              txt=txt + "<td width='90px'>" + todo + "</td>";
              txt=txt + "</tr>";	
					 }
				 }    
              document.getElementById('content-table').innerHTML=txt;
			  });   
  } 

// 按照样品编号 获取到实验计划后,并插入到 MES任务执行系统中
function insertData(element) {
  var updateTr = element.parentNode.parentNode;
  var expcode  ="";
  expcode = updateTr.childNodes[20].innerHTML;  
  expname = updateTr.childNodes[7].innerHTML;
  window.user_name = window.parent.sec_module.current_user();

  if (expcode.search(user_name) == -1 ) 
  {
   if(user_name == "Admin")
   {
   	  if (!confirm(user_name+ " :您是管理员,可获取此[申请单],确定获取?!")) {
        return;
      }; 
      
      var wt_num  ="";  
      wt_num = updateTr.childNodes[2].innerHTML;
      
      param["wt_num"] = wt_num;

      runSql("check_task", param, {outfmt:"json"}, function(result) {
			if (result.statusCode == 200) {
			
				var data = JSON.parse(result.response);
            	var num = data.length;
            	
            	alert(" ✔  ✔ 已有该任务申请单,样品编号: "+wt_num +" , 在下一流程界面上,请对该任务新建✍[执行计划]" );
			}
			else{
			 
        	{
   
    var sj_code="";    
    sj_code = updateTr.childNodes[3].innerHTML; 
   
    var sy_item =""; 
    sy_item = updateTr.childNodes[4].innerHTML;
   
    var sysdate =""; 
    sysdate = updateTr.childNodes[5].innerHTML;
   
    var days1 =""; 
    days1 = updateTr.childNodes[6].innerHTML;
   
    var expname =""; 
    expname = updateTr.childNodes[7].innerHTML;	
    
    var sy_name =""; 
    sy_name = updateTr.childNodes[8].innerHTML;

     	 param["sj_code"] = sj_code;
 	  	 param["sy_item"] = sy_item;
 	  	 param["sysdate"] = sysdate;
 	  	 param["days1"]  = days1;
 	  	 param["expname"]  = expname;
 	  	 param["sy_name"] = sy_name;

    var draw_no =""; 
    draw_no = updateTr.childNodes[9].innerHTML;
    
    var sy_lot =""; 
    sy_lot = updateTr.childNodes[10].innerHTML;	
    
    var sy_qty =""; 
    sy_qty = updateTr.childNodes[11].innerHTML;
    
    var sy_dept =""; 
    sy_dept = updateTr.childNodes[12].innerHTML;	
    
    var applicantcode =""; 
    applicantcode = updateTr.childNodes[13].innerHTML;
    
    var applicantname =""; 
    applicantname = updateTr.childNodes[14].innerHTML;

     	 param["draw_no"] = draw_no;
 	  	 param["sy_lot"] = sy_lot;
 	  	 param["sy_qty"] = sy_qty;
 	  	 param["sy_dept"] = sy_dept;
 	  	 param["applicantcode"]  = applicantcode;
 	  	 param["applicantname"] = applicantname;

    var days2 =""; 
    days2 = updateTr.childNodes[15].innerHTML;
    
    var comdate =""; 
    comdate = updateTr.childNodes[16].innerHTML;
    
    var findate =""; 
    findate = updateTr.childNodes[17].innerHTML;
    
    var appfindate =""; 
    appfindate = updateTr.childNodes[18].innerHTML;    
   
    var fee ="";     
    fee = updateTr.childNodes[19].innerHTML;
    
    var expcode =""; 
    expcode = updateTr.childNodes[20].innerHTML;	
    
    var keep =""; 
    keep = updateTr.childNodes[21].innerHTML;
    
    //alert("expcode 19: " +expcode);    
 	 param["days2"] = days2;
 	 param["comdate"] = comdate;
 	 param["findate"] = findate;
 	 param["appfindate"] = appfindate; 	  	 
 	 param["fee"] = fee;
 	 param["expcode"] = expcode;
 	 param["keep"] = keep;
 	  	 
    var memo =""; 
    memo = updateTr.childNodes[22].innerHTML;
    
    var stage =""; 
    stage = updateTr.childNodes[23].innerHTML;
    
    var flag =""; 
    flag = updateTr.childNodes[24].innerHTML;
    
    var pcode =""; 
    pcode = updateTr.childNodes[25].innerHTML;
    
    var ypcfdate =""; 
    ypcfdate = updateTr.childNodes[26].innerHTML;	
    
    var ypcldate =""; 
    ypcldate = updateTr.childNodes[27].innerHTML;
 	  	 
    param["memo"] = memo;
 	param["stage"] = stage;
 	param["flag"] = flag;
 	param["pcode"] = pcode;
 	param["ypcfdate"]  = ypcfdate;
 	param["ypcldate"] = ypcldate;
 	param["getuser"] = user_name;
 	param["gettime"] = getTag("app.currentTime");

     
	var opt = {
	     "outfmt": "json"  
	};
    
    var cbfn = function(result){
	     alert(" ✔ 成功获取了任务申请单,其对应【样品编号】: " + wt_num +"  ,在下一流程界面上,请对该任务新建✍[执行计划]" ); 
	};
    
    runSql("insert_task", param,opt,cbfn); 
   }
  } // end ---保证数据库里记录唯一性,插入该条任务
 });       
     			  
    }
	  else{
	  	alert(user_name+" :权限不够!不可以获取此申请单!请使用IGX产品自带的账户Admin登录本系统。");  
      return false;
    }	
  } 
  else  
  {
      alert(user_name+" :登录人员,属于此申请单的实验员,可以获取!");  
  
      var wt_num  ="";   
      wt_num = updateTr.childNodes[2].innerHTML;
      param["wt_num"] = wt_num;
      runSql("check_task", param, {outfmt:"json"}, function(result) {
				
	  if (result.statusCode == 200) {
	     var data = JSON.parse(result.response);
    	 var num = data.length;
    	 alert(" ✔  ✔ 已有该检测任务申请单,样品编号: "+wt_num +" , 在下一流程界面上,请对该任务新建✍[执行计划]" ); 
	  }else{ 
	  {
        		
    var sj_code="";    
    sj_code = updateTr.childNodes[3].innerHTML; 
    
    var sy_item =""; 
    sy_item = updateTr.childNodes[4].innerHTML;
   
    var sysdate =""; 
    sysdate = updateTr.childNodes[5].innerHTML;
    
    var days1 =""; 
    days1 = updateTr.childNodes[6].innerHTML;
    
    var expname =""; 
    expname = updateTr.childNodes[7].innerHTML;	
    
    var sy_name =""; 
    sy_name = updateTr.childNodes[8].innerHTML;

	param["sj_code"] = sj_code;
	param["sy_item"] = sy_item;
	param["sysdate"] = sysdate;
	param["days1"]  = days1;
	param["expname"]  = expname;
	param["sy_name"] = sy_name;

    var draw_no =""; 
    draw_no = updateTr.childNodes[9].innerHTML;
   
    var sy_lot =""; 
    sy_lot = updateTr.childNodes[10].innerHTML;	
   
    var sy_qty =""; 
    sy_qty = updateTr.childNodes[11].innerHTML;
   
    var sy_dept =""; 
    sy_dept = updateTr.childNodes[12].innerHTML;	
   
    var applicantcode =""; 
    applicantcode = updateTr.childNodes[13].innerHTML;
   
    var applicantname =""; 
    applicantname = updateTr.childNodes[14].innerHTML;

     param["draw_no"] = draw_no;
 	 param["sy_lot"] = sy_lot;
 	 param["sy_qty"] = sy_qty;
 	 param["sy_dept"] = sy_dept;
 	 param["applicantcode"]  = applicantcode;
 	 param["applicantname"] = applicantname;

    var days2 =""; 
    days2 = updateTr.childNodes[15].innerHTML;
   
    var comdate =""; 
    comdate = updateTr.childNodes[16].innerHTML;
   
    var findate =""; 
    findate = updateTr.childNodes[17].innerHTML;
   
    var appfindate =""; 
    appfindate = updateTr.childNodes[18].innerHTML;    
   
    var fee ="";     
    fee = updateTr.childNodes[19].innerHTML;
    
    var expcode =""; 
    expcode = updateTr.childNodes[20].innerHTML;	
    
    var keep =""; 
    keep = updateTr.childNodes[21].innerHTML;

 	param["days2"] = days2;
 	param["comdate"] = comdate;
 	param["findate"] = findate;
 	param["appfindate"] = appfindate; 	  	 
 	param["fee"] = fee;
 	param["expcode"] = expcode;
 	param["keep"] = keep;
 	  	 
    var memo =""; 
    memo = updateTr.childNodes[22].innerHTML;
    
    var stage =""; 
    stage = updateTr.childNodes[23].innerHTML;
    
    var flag =""; 
    flag = updateTr.childNodes[24].innerHTML;
    
    var pcode =""; 
    pcode = updateTr.childNodes[25].innerHTML;
    
    var ypcfdate =""; 
    ypcfdate = updateTr.childNodes[26].innerHTML;	
    
    var ypcldate =""; 
    ypcldate = updateTr.childNodes[27].innerHTML;
   	
   	param["memo"] = memo;
	param["stage"] = stage;
	param["flag"] = flag;
	param["pcode"] = pcode;
	param["ypcfdate"]  = ypcfdate;
	param["ypcldate"] = ypcldate;
	param["getuser"]  = user_name;
	param["gettime"] = getTag("app.currentTime");
	
	var opt = {
		"outfmt": "json"  
	};
	
    var cbfn = function(result){
	     alert(" ✔ 成功获取任务申请单,其对应【样品编号】: " + wt_num +"  ,在下一流程界面上,请对该任务新建✍[执行计划]" ); 
	};
    runSql("insert_task", param,opt,cbfn); 
   }
  } // end ---保证数据库里记录唯一性,
 }); 
 }    
}

</script>

</html>
<script src="laydate/laydate.js"></script>  
<script>
    laydate.render({
    	  elem:   '#datep31'
    	 ,type:   'date'
       ,value:  '2020-01-01'
    });
    laydate.render({
    	  elem:   '#datep32'
    	 ,type:   'date'
    	 ,value:  new Date()
    });
</script>

     フラッド ボックスのスケジュールされたタスクを取得するための上記のコード セグメントでは、次のように、JS の RunSql 関数を直接参照することによって、スケジュールされたタスクのデータが取得されます。

runSql("getjc_task", param, {outfmt:"json"}, function(result){

    if (result.statusCode == 200) {
        #函数体处理逻辑
    }
}

このうち、 getjc_task は、以下の図に示すように、設計側の IGX を通じて事前に定義されます。

 getjc_task SQL ステートメントは次のとおりです。

select num as wt_num,
       code as sj_code,
       name as sy_name,
       draw_no,
       lot as sy_lot,
       qty as sy_qty,
       item as sy_item,
       dept as sy_dept,
       applicantCode,
       applicantName,
       sysDate,
       days1,
       days2,
       comDate,
       finDate,
       appfinDate,
       fee,
       expCode,
       expName,
       keep,
       Memo,
       stage,
       flag,
       pcode,
       ypcfdate,
       ypcldate 
from M_Experiment 
where sysDate>='@ts' and sysDate<='@ts2' and num like  '%@wt_num%' and code like  '%@sj_code%'  and expCode like  '%@expCode%' 
ORDER BY num DESC;

興味のある方は上記のコードをご自身で読んでみてください。

 上記の手順に基づいて、IGX WEB SCADA (WEB SCADA) をベースとしたデジタル作業場 MES システムを起動することができ、システムの起動と使用を通じて、システム全体としてお客様が期待する効果を達成できます。従来の        顧客 

     すべてのパートナーがこの記事または IGX WEB SCADA (  WEB SCADA  ) プラットフォームに興味がある場合は、パートナーは転送、コメント、プライベート メッセージの送信を歓迎します。誰もがお互いに助け合い、一緒に成長し、一緒に勝ちます。

     IGX WEB SCADA 適用企業:

1. 従来の構成プラットフォームを置き換える、オートメーション エンジニアリング、電気、およびオートメーションに従事する企業。

2. 独立した開発能力を持つソフトウェアエンジニアリング企業は、このプラットフォームに基づいて、顧客がデジタル生産ラインとMESシステムを構築し、ワークショップの機器と機器のデータ収集、監視と制御を実現し、既存の企業情報システムと高度に統合するのを支援します。

3. 電気オートメーション、モノのインターネット、産業制御などを専攻する大学は、IGX WEB SCADA プラットフォーム、IGX アプリケーション、実践および二次開発教材、モノのインターネット教材を推進します。

4. 現在モノのインターネット業界に従事している、または従事する予定のパートナー。

    これでこの共有は終わりです。パートナーの皆様、ありがとうございました。

おすすめ

転載: blog.csdn.net/m0_73346015/article/details/128123148