問題タブ [modbus]
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.
java - Web ベースの Java アプリケーションを使用したリモート ハンドリング PLC
ユーザーがシミュレーションを作成してロジックを実行できるシミュレーター アプリケーションを開発しています。現在、プロジェクトの第 2 段階では、Web ベースのアプリケーションを使用したハードウェア トリガーが必要です。modbusシリアル通信を使用しているJavaコードを使用してPLCマシンと対話する方法についての情報が必要でしたが、他のより良い解決策があれば変更できます。私の調査によると、OPCサーバーを見てきましたが、そこから何も得られませんでした。フローとは何かを理解するのを手伝ってくれる人が欲しいです。これをどのように進めるか。アプリケーションと PLC と通信するためのドライバーを作成する必要がありますか?
このタスクに完全に近づくには、何をする必要がありますか。リンクがある場合は共有してください
ありがとうございました
python - サーバー実装からの予期しない応答のため、Modbus TCP クライアントは接続を閉じます
Python のサーバー ソフトウェアとして Modbus over TCP を実装しました。アプリはマルチスレッド化されており、標準ライブラリに大きく依存しています。サーバー側での接続の管理に問題があります。一方、クライアントとしての Modbus over TCP としての私の実装は問題なく動作します。
実装の説明
- サーバーはマルチスレッドで、1 つのスレッドがフレーム受信用の SOCK_STREAM ソケットを管理します。
- select は効率上の理由から使用されます
- セマフォは、送受信中にソケット リソースへの同時アクセスを防止するために使用されます。
- Modbus 上位層のカプセル化は、送信メソッドと受信メソッドを介して透過的に行われます。とにかく、正しいヘッダーとペイロードを使用してフレームを構築するだけです...
- 別のスレッドが実行され、その中で Modbus の送信および受信メソッドが呼び出されます。
TCP コンテキスト
TCP が稼働中で、ポートにバインドされ、最大クライアントが設定され、リッスンしています。
Wireshark ショーの下のトレース:
- 依頼人:シン
- 私のアプリ サーバー: SYN、ACK
- クライアント: ACK
サーバー側では、まったく新しいソケットが期待どおりに作成され、クライアント ソケットにバインドされています。
これまでのところ、すべて問題ありません。
Modbus コンテキスト
- クライアント: Modbus フレームを送信、TCP フラグ = ACK + PUSH である 0x18
- 私のアプリ サーバー:待機せず、単一の空の TCP ack フレームを送信します。
- クライアント: tcp ack フラグ付きの modbus フレームを待ちます。したがって、それをエラーと見なし、接続を閉じるように求めます。
したがって、クライアント側のソケットが閉じられているか、すでに閉じられているため、サーバーソフトウェアはその後実際の応答を送信できません。
私の問題
- メインスレッドが処理する必要のある modbus フレームを受信しました (サーバー側)
- 処理には数ミリ秒かかります。その間、TCP ACK フレームがサーバー ソケットを介して送信されますが、何も送信しないでください。
ACK 動作を管理する方法について何か考えはありますか? naggle アルゴリズムについて読んだことがありますが、ここでの問題の範囲には含まれていないようです... setsockopt メソッドのオプションが私の問題も解決するかどうかはわかりませんが、間違っている可能性があります。
何か提案があれば、私は非常に興味があります... 私が十分に明確であることを願っています.
.net - ポーリングからイベントに変更する最良の方法は何ですか?
300 バイトの生データを 1 秒間に 20 回解析して、一連の WPF コントロール プロパティに変換するとしたら、どのようなソリューションになりますか?
より具体的には、Modbus 対応の PLC があり、それを制御するための WPF HMI を作成する必要があります。Modbus は、データ変更のポーリングを必要とする通信プロトコルです。対照的に、WPF と .NET Framework は一般にイベント ドリブン モデルを促進するため、データを 1 秒間に 20 回直接コントロールにプッシュするのは不自然に思えます。Modbus にはデータの変更を報告する手段がないだけでなく、バイトのハイレベルな表現も提供されません。開発者は、署名のない short の配列を意味のあるものに適切に分析する必要があります。
このようなデータを解析することは私にとって大したことではありませんが、一連のイベント対応の DependencyProperties (データ バインディングを想定) への適切な変換を考え出すことは困難です。変更を監視するための初期化コードや一時ストレージを大量に用意したくありません。
c - 異なるデータ型のバッファ コンテンツのコピー
MSP430コントローラーで実行されるmodbusプロトコルのコードを書いています。応答バッファ (グローバル) は、処理された要求に対する応答がシリアル UART で送信される 8 ビット データの配列です。さて、私の問題は、生成された応答が異なるデータ型の組み合わせを持っていることです。つまり、uint8、uint32、float です。グローバル応答バッファを使用してこのデータを送信する方法は?
float の場合、memcpy を使用してみましたが、これはうまく機能しているようです。より効率的で良い方法はありますか?フレームサイズが大きいため(20〜30バイトなど)。ここに私がやろうとしたことのデモがあります
c# - マルチスレッドとシリアル ポート
わかりました..これは長くなりますが、最初に背景を説明する必要があります.
私のソフトウェアのこの部分は、コンベア ベルトを下っていくアイテムを分類するためのものです。コンベアベルトにはModbusを使用しています。Modbus は特定の時間にゲートを開き、アイテムがゲートを通過できるようにします。アイテムは重量に基づいて特定のゲートを通過します。
アイテムがはかりに載っていることを判断するためにセンサーを監視しています。センサーがブロックされると、アイテムは計量され、適切なゲートに送られます。ゲートの開閉にはタイマーが設定されています。
私のコードはこれで機能します..問題は、複数のアイテムでは機能しないことです。つまり、ゲートが開いている間は、ゲートが閉じられるまでセンサーは監視されません。そのため、アイテム A がゲートに向かう途中で、アイテム B がセンサーをブロックしても、アイテム B ははかりで計量されません。一度に最大 8 個のアイテムを並べることができました。ここに私が今実行しているコードがあります:
このコードは正常に機能します。行の複数の項目を説明できるようにする必要があるだけです。助言がありますか????
私も次のことを試しました:
これを行うと、開始ボタンが押されたときに両方のスレッドを開始しました。あらゆる種類の例外が発生し、プログラムは最終的に SEHException をスローしてクラッシュします。私が得る他のエラーは、「シリアルポートはすでに開いています」または「I / Oエラー」と言います。
c# - C# BackgroundWorker と Com ポートの問題
Ok。2 つの COM ポートを監視するプログラムがあります。1 つはスケールに接続され、もう 1 つは Modbus ボードに接続されています。
私の問題は、modbus ボードに接続されている COM ポートにあります。私のプログラムは、100MSごとに(modbusボード上の)センサーを読み取っています。センサーがブロックされているかどうかを判断するために、(COM ポート経由で) 0 または 1 を返します。ブロックされている場合、信号はポートを介してボードに送信されます。
私の問題は、センサーの監視を終了できないことですが、他の信号を送信する前に、COM ポートが使用されていないことを確認する必要があります。
センサーを監視するルーチンは、backgroundworker スレッドにあります。センサーが作動すると、Modbus ボードに信号を送信する別のスレッドが生成されます。そのため、ボードに信号を送信している間は「センサー スレッド」を一時停止する必要があります。どうすればこれを行うことができますか?
これは BackgroundWorker であるため、Thread.Join はオプションではないことに注意してください。
これが私のコードです:
このスレッドの RunWorkerCompleted は、スレッドを再起動するだけです。次のスレッドは、センサーがいつブロックされるかを確認するために、「sensorstatus」を常に監視しています。
このための RunWorkerCompleted は、このスレッドを再起動し、ループにします
silverlight - System.Net.Sockets.TcpClient は windowsphone に存在しません。これを修正するにはどうすればよいですか?
私は、さまざまなブランドの plc に接続するプログラムに取り組んでいるため、さまざまなプロトコルを使用してそれらと通信します。Modbus プロトコルを実装するための素敵な小さなライブラリ(ライブラリ プロジェクト ページはクリック)を見つけました。(コンソールで)テストしたとき、それは魅力のように機能しました。しかし今、私はそれを自分の Windowsphone アプリケーションに実装したいと思っています。名前空間が見つからないというエラーが発生します。
Google でしばらくしてから、Silverlight フレームの動作が System.Net.Sockets.TcpClient 名前空間を実装していないことがわかりました。
したがって、私はこのライブラリを使用できません..この問題を克服するための「簡単な」回避策はありますか?
silverlight - Modbus Tcp Silverlight 用
元の質問:
Silverlight フレームワークを使用して tcp で modbus デバイスに接続する方法を示す Silverlight ライブラリまたは例を探しています。
tcpClient を使用する複数のライブラリを見つけましfrom system.net.sockets.tcpclient
たが、この名前空間は Silverlight では利用できません。したがって、.net ライブラリではうまくいきません。
また、背景情報として、私は Windows Phone アプリを作成しています。msdn サイト(リンク)の「Windowsphone でソケットを使用する」の例を既に調べています。
編集1:
しばらくプログラミングした後、System.net.sockets
ライブラリのみを使用して modbus デバイスの保持レジスタに書き込むことができます。問題は、modbus デバイスからリターン バイトを受け取ることです。また、バイトを返すmodbusデバイスのレジスタを読み取る受信機能もありました。
私はこのようなバイトをキャッチしていました(使用System.Net.Sockets.TcpClient
:
私が求めているのは次のことです: 1. System.net.Sockets
Networkstream.Readbyte と同じ機能を持つ関数はありますか? 2. 同じことができる関数がない場合。他の方法はありますか?もしそうなら、例はありますか?誰かが私を始めさせることができますか?
ありがとう :)
modbus - SCADA システムで、modbus マスターを別のマスターと通信させる方法はありますか?
データを交換する 2 つの SCADA システムを作成しています。両方のシステムがこのプロトコルをサポートしているため、TCP 経由で Modbus を使用することを目指しています。問題はもちろん、両方のシステムが modbus マスターとしてしか機能できないことです。
フィールドバスのオープン ソースがすべて出回っている中、2 つのマスターを相互に通信させる「ブリッジ」ユーティリティが存在しないことに驚きました。私はテクノロジーに特に精通しているわけではありませんが、外部から見ると、2 つのポートを開き、2 つの別々のマスターのスレーブとして機能するプロセスを実装するのは簡単なことのように見えます。
両方のマスターは仲介者をスレーブとして認識しますが、Master1 の POV からの入力レジスターは Master2 の POV からの出力レジスターであり、その逆も同様です。
これが問題であることを示唆するものは、概念的またはプロトコル的に何かありますか?
c# - コマンドMODBUSを拒否するシリアルオーバーIPに通信しますか?
これは奇妙なことです。IPとそれがリッスンするポートを備えたプリンターセットアップがあり、次に印刷ジョブをプリンターに送信する必要があります。
なんとかプリンターに接続できましたが、何かを送信すると、プリンターでタイムアウトが発生するか、何もせずにそのままになります。
ログに表示されているプリンタと通信できることはわかっています。
これまでのところ、私は次のものを持っています:
マニュアルによると、私は次のことをする必要があります:
おそらくお分かりのように、私はこれを達成する方法がわからないので、すべての人が歓迎します
いくつかの追加情報、プリンターにはドライバーが付属していないので、生データをプリンターに送信する必要があると私が言えることから、プリンターにはシリアル接続がありますが、シリアルケーブルには遠すぎるためイーサネット接続ですそこにあります(イーサネット経由のシリアルだと思います)。
ダイアログの一般原理コンピューターはENQ(1バイト)を送信しますプリンターはACK(1バイト)を送信しますコンピューターはデータを送信します(同一1バイト|長さ2バイト|データ0〜nバイト|チェックサム1バイト)プリンターはAck(1バイト)を送信します
過去にシリアルを使用したことがある場合、ポートで書き込み機能を使用してデータを送信し、データをバッファーに入れ、受信が終了したらバッファーをチェックしましたが、IPでこれをどのように行うかについてはわかりません?