itLinkedInPocketCopyC#の実装メモ。TCPにて、三菱製PLC(内蔵Ethernetポート)とMCプロトコルにて通信を行い、GUI上でPLCのメモリをスムーズに読み書きできるアプリケーションを作製しました。製品レベルのクオリティですが、ソースコード全文をほとんどそのまま公開します。参考にしてもらえれば、様々な通信系アプリに応用できると思います。(私は慣れているので1日程度で作成できましたが、慣れていないと、マネして作るだけでも1週間はかかると思います)「キーワード」の章をご参照頂き、そこに読みたい情報があれば参考にしていただけると幸いです。画面処理(delegate、invokeなどのコールバック系/各種ボタンのイベントハンドラ)、通信処理(TCPクライアント)あたりで、色々参考になるかと思います。PCは、.Net4.7インストール済みPC(Windows7/Windows10)で動作します。三菱PLC側は、「Q**CPU」系統で、CPUユニット内蔵のEthernet内蔵のCPUのみ通信可能です(通信コマンド「QnA互換3Cフレーム」を使用するため)。改造して、「QnA互換3Eフレーム」に対応すれば、Ethernetユニットとも通信可能に出来ます。(暇があればやるかも。)完成画面(動作イメージ)下記画面にて、三菱PLC(CPUユニット内蔵Ethernetポート)のIPアドレス、ポート番号を設定して、三菱PLCとリアルタイムに通信を行います。通信は以下2種類の処理を行います。指定したメモリアドレスの値を読み出し、画面に表示します。画面で編集した値をPLCに書き込みます。画面レイアウトクラスの名前、デフォルトだった...(笑)。画面のレイアウトと各コントロール名は以下の様につけています。「GuiMelsecData」は「dataGirdView(データグリッドビュー)」というコントロールを使用しています。ソースコードメイン画面の処理部分のソースコードです。デザイナ―部分は割愛しますが、画面レイアウトと同じコントロール名にすれば、以下のソースがそのまま使えるかと思います。画面処理部分のソースを丸々載せておきます。true;}}}}深く解説はしませんが、ポイントは以下の通りです。コールバック(m_melsecMgr.m_onConnect)、「受信検知」用のコールバック(m_melsecMgr.m_onRecv)を登録します。「通信開始」ボタン(GuiStartButton)押下で、イベントハンドラ「GuiStartButton_Click()」を駆動します(画面デザイナにて、「通信開始」ボタンをダブルクリックすれば、イベントハンドラの登録が自動的に出来ます)。関数内で、「m_melsecMgr.StartMelsec()」を呼び、通信を開始します。受信検知時は、(1)でm_onRecvに登録したコールバック関数「OnRecv()」が駆動します。OnRecv()内で、受信データをデータグリッドビュー(GuiMelsecData)に反映します。イベントハンドラ「MelsecData_EditingControlShowing()」、編集終了時にイベントハンドラ「MelsecData_CellValueChanged()」が駆動します。編集終了と共に、三菱PLC通信クラスの送信キューに、編集したセルの値を書き換える「メモリ書込」電文を追加します。通信クラスは、キューに追加された電文を送信する仕組みにしています。ソースコードiniファイルとのアクセスを行うクラスです。ファイルに書き込みます。「通信監視」(画面下部)側の各パラメータは、変更時に即座にiniファイルに書き込むようにしています。iniファイルの読み書きを参考にしたい方は読んでみて下さい。通信部分を読みたい方は特に気にせず飛ばしてOKです。大したことはやっていませんので。ソースコードTCPクライアント部分は、先の記事『C#で「TCPクライアントを実装する」』で紹介したソースコードをゴッソリそのまま使っています(namespaceだけ変えました)ので、ここでの紹介は割愛します。以下の記事をご参照し、そのままご使用下さい。てぃってぃの楽しい副業生活!C#でTCPクライアントをササッと作る必要があったので、その時の個人用メモ。ソースコード三菱PLCとの通信を行う、本アプリケーションの一番重要部分ですね。メイン画面の「通信開始」ボタンから本クラスの「StartMelsec()」が呼ばれ、通信開始します。通信の実体自体は「TcpClient」クラスにて実装しています。});}}}}といっても、結構ソースはシンプルです。メンバに「ConnectEventHandler」と「RecvEventHandler」をdelegateで宣言します。型なので、名前は自由に付けられます。delegateで宣言したこの型を、event型でメンバに宣言しておきます。メイン側で「切断検知」と「受信検知」時にコールバックしたい関数を、このevent型で登録したメンバに追加(+=)することで、三菱PLC通信クラス側からコールバックを呼ぶことができます。通信開始関数「StartMelsec()」で、通信スレッド「MelsecThread」を駆動します。通信スレッド「MelsecThread」にて、通信処理を行います。メモリ書込電文は、送信キューの「m_sendQue」にデータが入っていれば、それを送ります。その後、メモリ読出電文を「MakeCommData()」にて作成し、メモリ読出を行います。「m_melsecComm.Receive()」にて受信が行えるので、受信結果を解析し、メイン画面側にコールバック「m_windowHandle.Invoke()」にて通知します。3Cフレーム」にて実装しています。「3Eフレーム」等に対応したい場合でも、この関数を数行いじるのと、受信処理を数行いじるだけで対応できるかと思います。免責事項おそらく産業系ネットワークプログラマに需要があるかなと思い、公開してみました。何か間違いなどあれば、コメント欄にお願いします。本ソースを商用利用することはかまいませんが、本ソースの不具合による損害・損失等の補償は致しかねるので、ご了承下さい(かたっ)。ご購読、ありがとうございました。...C#で「TCPサーバー」を実装する(ルーティング[TTL]対応版)C#でTCPサーバーを安定して動作出来るように実装したので、その時のメモ。画面描画(マップチップ)の設計こんばんは、てぃってぃ(嫁)の夫です。「スマホでローグライク開発」第3回です。スマホ用ローグライクゲームを開発したいこんばんは、てぃってぃ(嫁)の夫です。前々からやりたかったこと。...【Unity/ゲームプログラミング】初心者向け画面処理のメモUnityで絶賛ローグライクのゲームプログラミング中です。PMコメントありがとうございます。はい、参考にしてみてください。287行目MakeTeleLogでエラーでました。ご指摘ありがとうございます。PMはじめまして、こちらのコードはGit等に上がっていませんでしょうか。実際のアプリケーションを使用して参考にさせていただきたく思っております。ご検討のほどよろしくお願いいたします。PMコメントありがとうございます。実は同様の声を他の方からも頂いているのですが、なかなか忙しくて追いついておらず。今後とも宜しくお願いします。こちらを参考にアプリケーションを作成したのですが、PLCの実機がなく試せないです。AMコメントありがとうございます。仕事でPLC模擬は開発しているのですが、すみません、ちょっと色々な面で無償では公開できないです。PLCの通信I/Fは三菱会員登録さえしていれば仕様書をDL出来ますので、それを見て実装されるのが良いと思います。そこまで難しくはないです。(慣れていれば1週間もあれば作れるかと。(CPU内蔵Ethernetポート向け)とありますが、こちらはすでに3Eフレーム対応版になっているということでしょうか。動作環境のところで3Eフレーム対応には改造が必要と説明があったので少々混乱があります。PMコメントありがとうございます。書いてる事に矛盾がありますね。コメントにも「CPU内蔵Ethernetポート向け」という記載があることから、動作環境の所の記載が正しく、3Cフレームだと思います。ソースコード上のコメントを修正しておきました。正しくは三菱のマニュアルの通信フォーマットを見てご判断頂ければと思います。PM大変お世話になっております。画面で入力した設定が出力されるiniファイルの全文を見たいのですが可能でしょうか。PMコメントありがとうございます。すみません、ソースがもう今のPCにないのでパっとは見せられないです。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスウェブサイト次回のコメントで使用するためブラウザーに自分の名前、メールアドレス、サイトを保存する。てぃってぃコメントありがとうございます。ご指摘通り、上書きしてしまいますね。改訂履歴に記載し、修正しました。てぃってぃコメントありがとうございます。書いてる事に矛盾がありますね。てぃってぃコメントありがとうございます。すみません、ソースがもう今のPCにないのでパっとは見せられないです。