問題タブ [plc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
16659 参照

decimal - PLCでBCD=Decimalなのはなぜですか?

この質問は、私の前のSO質問の表彰から派生しています。

PLCのBCDと小数の解釈と混同しています。PLCのドキュメントでは、BCD=10進数を意味します。

ここに画像の説明を入力してください

この命令は、D300、0100の内容をBCDとして読み取ります。Cyber​​ Slueth Omegaの回答オンラインBCD-Hexコンバーターを参照すると、0100(BCD)= 4(Decimal)= 4(Hex)ですが、ドキュメントには0100(BCD)= 100(Decimal)と記載されています。

なんで?

0 投票する
1 に答える
1883 参照

logic - PLCでの条件フラグの正しい使用

PLCのドキュメント(オムロン)には、条件フラグの正しい使用法と誤った使用法が示されています(画像を参照)。しかし、この2つの違いはわかりません。命令Aがオンの場合、命令Bとラベルのない命令の両方が実行されます。両方のラダー図は、私にとって同じことを達成することを意味します。なぜ一方が正しくなく、もう一方が正しいのですか?

ここに画像の説明を入力してください

0 投票する
1 に答える
971 参照

plc - PLCのキャリーイン演算機能とは?

「キャリー」は数学の授業で何をしますか?

以下を例に取ります: 2 つのバイナリの合計は、結果の値以外に CY という特別なものを生み出します。1+2=3+いくらかのキャリー?

ドキュメントには、「加算の結果キャリーが発生した場合、キャリー フラグは O になります」と単純に記載されており、キャリーとは何か、キャリー フラグとは何かについての説明はありません。それらは何ですか? また、キャリーを使用する場合と使用しない場合の加算命令の違いは何ですか?

ここに画像の説明を入力

0 投票する
1 に答える
1208 参照

language-agnostic - PLCにメッセージをどのように伝達しますか

PLCの経験はまったくありませんが、次のプロジェクトでは、PLCと通信するアプリケーションを開発する必要があります。基本的に、PLCに転送する必要のあるXMLメッセージを受け取ります。PLCコードの開発は行いませんが、PLCデータ構造(xmlスキーマにできるだけ近いもの)を設計してPLCにメッセージを送信する方法を理解したいと思います。

アプリケーションのプログラミング言語はまだ選択されていないため、どの言語の例でもかまいません。

0 投票する
1 に答える
2513 参照

simulation - PLC上のTCP/IPイーサネット通信

Omron PLC (CP1L) をイーサネット オプション ボードを介して PC に接続しようとしています。接続を正しくセットアップし、PLC に接続して IP とさまざまな設定を構成できます。

次に、ラダープログラムを正しく実行するのに問題があります。

ドキュメントでは、通信が有効になるとアドレス A202.00 がオンになると記載されていますが、ラダー プログラムをシミュレートすると、常にアドレス A202.00 がオンになります。Ethernetケーブルを抜いてもアドレスがONのまま。PLC と PC をイーサネット ケーブルで接続していないのに、アドレスがオンのままである理由がわかりません。

ドキュメンテーション

シミュレートされたラダー プログラムは、A202.00 が常にオンになることを示します。

はしごのスクリーンショット

0 投票する
1 に答える
5361 参照

plc - ラダープログラムを使用して、PLCからPCにTCP/IPメッセージを送信します

接続が有効になっているかどうかをチェックする次のラダープログラム(A202.00)を検討してから、PLCからPCにメッセージを送信します。

ラダープログラム

ドキュメント(Omron CX-Programmer)には、プログラムの規則についての説明が大幅に不足しています。私が理解していないのは:

  1. ノードからノードにメッセージを送信します。受信者IDを指定する必要があります。ファンクションブロックにはIPアドレスを挿入できるオプションがないようです。DMアドレス(D300)へMOVのIPアドレスを使用することになっていますか?その場合はどうすればよいですか(IPアドレスの4バイトの間にドットがあります..)?

  2. S誰かが(最初のソースワード)、D最初の宛先ワード)、C最初のコントロールワード)とは何かを説明できますか?それらは単なるメモリアドレスではありませんか?たとえば、メモリアドレスのコンテンツを別のメモリアドレスに送信しますか?


[編集]

私は何をしようとしていますか?

オムロンPLCを使用して、測定ゲージ(PC / C#アプリケーションによってイーサネット経由で制御)をロボットシステム(RS232またはシリアルなし、TCP / IPなし、最も単純なI / Oポイントのみ)に接続しようとしています。ゲージが測定を完了すると、C#アプリはコマンドをOmron PLCに送信します。このコマンドは、受信したコマンドに応じて、ロボットのI/Oポートへの電圧フローをトリガーする出力をオンまたはオフに切り替えます。

FINSを使用する必要がありますか?これを行うために知っておく必要のあるPLCの機能/プロトコルは何ですか?わからないので、ドキュメントからすべての機能をテストしています。これまでのところ、進捗はありません。

0 投票する
2 に答える
2346 参照

tcp - PLCコントローラにカスタムTCPパケットをリッスン/送信させますか?

PLCでカスタムコマンドを送受信できるように、PLCコントローラと通信できるようにしたいと思います。

これを実行できるという私の考えは、特定のポートでTCP着信パケットを読み取り、パケット内のコマンドに基づいてルーチンを実行できるTCPリスナーをPLCに配置することでした。また、TCP/IPを介して情報を送り返すこともできます。

これにより、C#、PHP、JavaScriptなどの複数の言語でソフトウェアを記述できるようになり、Windows、iOS、Androidなどの任意のプラットフォームでソフトウェアを使用してPLCにコマンドを発行できるようになります。これは、PLCを表示または制御するためにPLCソフトウェア(コストがかかる可能性がある)を必要としないことも意味します。

私はPLCプログラマーではないので、PLCにカスタムTCPパケットを送受信する機能があるかどうかはわかりません。a)可能であればb)これを行うことがどれほど実行可能であるかc)これを達成するために正確に何を研究すべきかを知りたい。

ありがとう。

0 投票する
1 に答える
15313 参照

c# - C#からPLCにFINSコマンドを送信します

PC(C#.NET)からPLCイーサネットモジュール(Omron)にUDPを介してFINSコマンドを送信しようとしましたが、PLCから応答がなく、トラブルシューティングを開始できる手がかりがありません。

PLCには、次のような非常に単純なラダーロジックがあります。DM100の値がの場合#0001、出力でトリガーします101.00。(ここで、「トリガー」はメモリ領域の単なるシンボル名でD100あり、「出力」は出力のシンボルです101.00ここに画像の説明を入力してください

次に、コマンドコードが「MemoryArea Write」のFINSコマンドを実行するC#を作成し01 02、その後に開始アドレス、書き込み項目数、データを記述しました。C#コードは、オンをトリガーする0001ためにPLCの領域に#の値を書き込む必要があります。D100101.00

[機能しない削除されたコード]..

出力101.00がトリガーされず、例外も発生しませんでした。私は次のことを確認しました:

  1. ポート、ノード、およびアドレスは、CX-Programmerの「WorkOnline」で確認されたとおりに正しく構成されています。また、ノードが接続されていることを確認するために、各IPにpingを実行しました。
  2. UdpClientパケットを正常に送受信する非常に単純なサーバー/クライアントコードを記述したので、コードは有効です 。
  3. ラダーロジックは問題ありません。ラダーをPLCに転送し、モニターモードでWork Onlineを使用してテストし、D100手動で値を設定しました。

配列に間違いがあるのではないかfins_cmndと思いますが、私のコードに見られるように、各値について可能な限り詳細にコメントしています。私はおそらく自分が何かを逃しているのを見つけることができません。16進数を正しく解析していない可能性があると思いますが、繰り返しになりますが、私をガイドする例外はありません。

どこでどのようにトラブルシューティングできるかわかりません。FINSプログラミングまたはPLCの経験を持つ誰かが私に助けを提供してくれることを願っています。

[回答] リンクを提供してくれたPorge
に 感謝します-それで問題が見つかりました。いくつかのトレイルの後、最終的にそれを機能させます。動作するコードについては、以下を参照してください。

0 投票する
2 に答える
5573 参照

c# - 例外なく Socket.Receive でハングアップする

FINS コマンド/フレームを使用してイーサネット (UDP パケット) 経由で PLC と通信する (つまり、オムロン PLC のメモリ アドレスの書き込み/読み取り) WPF C# アプリケーションがあります。

コマンドをWRITE PLC アドレスに正常に送信できますが、 READコマンド中に PLC から応答を取得しようとすると、アプリケーションがハングまたはクラッシュします。

PC から PLC に送信される FINS パケット フレーム:

次のコードは、ソケットの送受信です。

Try-Catchも使用しようとしましたが、アプリケーションのハング中に例外はキャッチされません。私は言うeventvwrをチェックしました:

ソース: Application Hangs - "...stopped interacting with Windows and was closed" 詳細:(screenshot below)

ここに画像の説明を入力

0 投票する
2 に答える
2866 参照

c# - C# でインタープリターを作成する: 命令を実装する最良の方法は?

C# を使用して PLC 言語インタープリターを作成しています。その PLC 言語には、20 を超えるデータ タイプと 25 程度の命令が含まれています。コードの生成を開始するとすぐに、命令を記述する 2 つの異なる方法のバランスを取ります。

1) あらゆる種類の命令はswitch、データ型を選択するために big を含む 1 つのクラスで表されます。例:

2) 各クラスは、単一のデータ型を持つ単一の命令を表します。このようにして、大きなものを避けswitchます。例:

COMMAND desing pattern ( Exec()) を使用して命令を記述しています。大きなスイッチを回避するため、2 番目の選択肢の方が優れていると思いますが、400 以上の命令を記述する必要があります。

この場合、翻訳のパフォーマンスよりも実行のパフォーマンスの方が重要であることを常に念頭に置いてください。

したがって、私の正確な質問は次のとおりです。命令とデータ型を因数分解する他の方法はありますか? パフォーマンスを犠牲にすることなく、より少ない量の命令を書くことを探しています。

編集:

この図は、私の型階層を示しています。

型階層

これは INT クラスの実装です。

一部のクラスはより複雑です (構造体、配列など)。

操作のプッシュとポップは次のように定義されます。

最後に、メモリの読み取りと書き込みの操作です。

この情報がお役に立てば幸いです。ありがとうございました。