問題タブ [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.
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)と記載されています。
なんで?
logic - PLCでの条件フラグの正しい使用
PLCのドキュメント(オムロン)には、条件フラグの正しい使用法と誤った使用法が示されています(画像を参照)。しかし、この2つの違いはわかりません。命令Aがオンの場合、命令Bとラベルのない命令の両方が実行されます。両方のラダー図は、私にとって同じことを達成することを意味します。なぜ一方が正しくなく、もう一方が正しいのですか?
plc - PLCのキャリーイン演算機能とは?
「キャリー」は数学の授業で何をしますか?
以下を例に取ります: 2 つのバイナリの合計は、結果の値以外に CY という特別なものを生み出します。1+2=3+いくらかのキャリー?
ドキュメントには、「加算の結果キャリーが発生した場合、キャリー フラグは O になります」と単純に記載されており、キャリーとは何か、キャリー フラグとは何かについての説明はありません。それらは何ですか? また、キャリーを使用する場合と使用しない場合の加算命令の違いは何ですか?
language-agnostic - PLCにメッセージをどのように伝達しますか
PLCの経験はまったくありませんが、次のプロジェクトでは、PLCと通信するアプリケーションを開発する必要があります。基本的に、PLCに転送する必要のあるXMLメッセージを受け取ります。PLCコードの開発は行いませんが、PLCデータ構造(xmlスキーマにできるだけ近いもの)を設計してPLCにメッセージを送信する方法を理解したいと思います。
アプリケーションのプログラミング言語はまだ選択されていないため、どの言語の例でもかまいません。
simulation - PLC上のTCP/IPイーサネット通信
Omron PLC (CP1L) をイーサネット オプション ボードを介して PC に接続しようとしています。接続を正しくセットアップし、PLC に接続して IP とさまざまな設定を構成できます。
次に、ラダープログラムを正しく実行するのに問題があります。
ドキュメントでは、通信が有効になるとアドレス A202.00 がオンになると記載されていますが、ラダー プログラムをシミュレートすると、常にアドレス A202.00 がオンになります。Ethernetケーブルを抜いてもアドレスがONのまま。PLC と PC をイーサネット ケーブルで接続していないのに、アドレスがオンのままである理由がわかりません。
シミュレートされたラダー プログラムは、A202.00 が常にオンになることを示します。
plc - ラダープログラムを使用して、PLCからPCにTCP/IPメッセージを送信します
接続が有効になっているかどうかをチェックする次のラダープログラム(A202.00)を検討してから、PLCからPCにメッセージを送信します。
ドキュメント(Omron CX-Programmer)には、プログラムの規則についての説明が大幅に不足しています。私が理解していないのは:
ノードからノードにメッセージを送信します。受信者IDを指定する必要があります。ファンクションブロックにはIPアドレスを挿入できるオプションがないようです。DMアドレス(D300)へ
MOV
のIPアドレスを使用することになっていますか?その場合はどうすればよいですか(IPアドレスの4バイトの間にドットがあります..)?S
誰かが(最初のソースワード)、D
(最初の宛先ワード)、C
(最初のコントロールワード)とは何かを説明できますか?それらは単なるメモリアドレスではありませんか?たとえば、メモリアドレスのコンテンツを別のメモリアドレスに送信しますか?
[編集]
私は何をしようとしていますか?
オムロンPLCを使用して、測定ゲージ(PC / C#アプリケーションによってイーサネット経由で制御)をロボットシステム(RS232またはシリアルなし、TCP / IPなし、最も単純なI / Oポイントのみ)に接続しようとしています。ゲージが測定を完了すると、C#アプリはコマンドをOmron PLCに送信します。このコマンドは、受信したコマンドに応じて、ロボットのI/Oポートへの電圧フローをトリガーする出力をオンまたはオフに切り替えます。
FINSを使用する必要がありますか?これを行うために知っておく必要のあるPLCの機能/プロトコルは何ですか?わからないので、ドキュメントからすべての機能をテストしています。これまでのところ、進捗はありません。
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)これを達成するために正確に何を研究すべきかを知りたい。
ありがとう。
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の領域に#の値を書き込む必要があります。D100
101.00
[機能しない削除されたコード]..
出力101.00
がトリガーされず、例外も発生しませんでした。私は次のことを確認しました:
- ポート、ノード、およびアドレスは、CX-Programmerの「WorkOnline」で確認されたとおりに正しく構成されています。また、ノードが接続されていることを確認するために、各IPにpingを実行しました。
UdpClient
パケットを正常に送受信する非常に単純なサーバー/クライアントコードを記述したので、コードは有効です 。- ラダーロジックは問題ありません。ラダーをPLCに転送し、モニターモードでWork Onlineを使用してテストし、
D100
手動で値を設定しました。
配列に間違いがあるのではないかfins_cmnd
と思いますが、私のコードに見られるように、各値について可能な限り詳細にコメントしています。私はおそらく自分が何かを逃しているのを見つけることができません。16進数を正しく解析していない可能性があると思いますが、繰り返しになりますが、私をガイドする例外はありません。
どこでどのようにトラブルシューティングできるかわかりません。FINS
プログラミングまたはPLCの経験を持つ誰かが私に助けを提供してくれることを願っています。
[回答] リンクを提供してくれたPorge
に
感謝します-それで問題が見つかりました。いくつかのトレイルの後、最終的にそれを機能させます。動作するコードについては、以下を参照してください。
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)
c# - C# でインタープリターを作成する: 命令を実装する最良の方法は?
C# を使用して PLC 言語インタープリターを作成しています。その PLC 言語には、20 を超えるデータ タイプと 25 程度の命令が含まれています。コードの生成を開始するとすぐに、命令を記述する 2 つの異なる方法のバランスを取ります。
1) あらゆる種類の命令はswitch
、データ型を選択するために big を含む 1 つのクラスで表されます。例:
2) 各クラスは、単一のデータ型を持つ単一の命令を表します。このようにして、大きなものを避けswitch
ます。例:
COMMAND desing pattern ( Exec()
) を使用して命令を記述しています。大きなスイッチを回避するため、2 番目の選択肢の方が優れていると思いますが、400 以上の命令を記述する必要があります。
この場合、翻訳のパフォーマンスよりも実行のパフォーマンスの方が重要であることを常に念頭に置いてください。
したがって、私の正確な質問は次のとおりです。命令とデータ型を因数分解する他の方法はありますか? パフォーマンスを犠牲にすることなく、より少ない量の命令を書くことを探しています。
編集:
この図は、私の型階層を示しています。
これは INT クラスの実装です。
一部のクラスはより複雑です (構造体、配列など)。
操作のプッシュとポップは次のように定義されます。
最後に、メモリの読み取りと書き込みの操作です。
この情報がお役に立てば幸いです。ありがとうございました。