テクセル

Modbus通信用DLL


本ソフトウエアは、Modbusプロトコルにおける通信用DLLです。シリアル通信及びModbus/TCPに対応します。 Modbus対応装置におけるビット、ワードデータの読み込み、書き込みが出来ます

1.シリアル通信用DLL

本DLLは、Modbus通信のマスターとして動作します。

1.基本仕様

インターフェース シリアル通信(RS-232C、RS-422/485)
伝送フレーム RTUモード, ASCIIモード
伝送速度 300/600/1200/2400/4800/9600/14400/19200/38400/57600/115200 bps
伝送データ データ長8ビット、1スタートビット、パリティ 偶数、奇数またはなし
対応.NET .NET Framework4.5 64ビット、32ビット

2.メソッド一覧

2-1.通信用

メソッド名は、RTUモード、ASCIIモード共通です。

メソッド名 説明
Open シリアル通信ポートをオープンします。
Close シリアル通信ポートをクローズします。
SetAddress 通信を行うスレーブ側のアドレス(局番)を指定します。
ReadCoils (01) DO(Discrete Output)のON/OFF状態を読み込みます。
ReadDiscreteInput (02) DI(Discrete Input)のON/OFF状態を読み込みます。
ReadHoldingRegister (03) 保持レジスタの内容を読み込みます。
ReadInputRegister (04) 入力レジスタの内容を読み込みます。
WriteSingleCoil (05)) 1つのDO(Discrete Output)へ書き込みを行います。
WriteSingleRegister (06) 1つの保持レジスタへ書き込みを行います。
WriteMultipleCoils (15)) 連続したDO(Discrete Output)へ書き込みを行います。
WriteMultipleRegisters (16) 連続した保持レジスタへ書き込みを行います。
SetWatchTime スレーブからの応答監視時間をセットします。
Version 本DLLのバージョン情報を取得します。
コールバック関数 実行結果は、コールバック関数で取得します。

カッコ内の数字は、ファンクションコードです。

2-2.数値変換

modbus通信におけるクライアントとの読み込み、書き込みデータは、16ビット整数の配列データで行われます。 modbus通信にて32ビット整数、文字列、実数が使用されている場合は、以下の数値変換関数にて相互変換を行うことが出来ます。

メソッド名 説明
D2ToDW 2つのワード値(16ビット整数)をダブルワード値(32ビット整数)に変換します。
DWToD2 ダブルワード値(32ビット整数)を2つのワード値(16ビット整数)に変換します。
DarToStr ワード配列(16ビット整数)による文字列を文字列(string)に変換します。文字コードは、Shift_JISとなります。
StrToDar 文字列(string)をワード配列(16ビット整数)による文字列に変換します。文字コードは、Shift_JISとなります。
D2ToFloat 2つのワード値(16ビット整数)を実数(単精度)に変換します。
FloatToD2 実数(単精度)を2つのワード値(16ビット整数)に変換します。

2.Modbus/TCP用DLL

本DLLは、Modbus/TCP通信のマスターとして動作します。(TCPクライアント)

1.基本仕様

インターフェース イーサネットTCP/IP通信
対応.NET .NET Framework4.5 64ビット、32ビット

2.メソッド一覧

2-1.通信用

メソッド名 説明
Connect 指定された機器へModbus/TCPで接続します。
DisConnect 接続を切断します。
setUnitID ユニット識別子をセットします。
ReadCoils (01) DO(Discrete Output)のON/OFF状態を読み込みます。
ReadDiscreteInput (02) DI(Discrete Input)のON/OFF状態を読み込みます。
ReadHoldingRegister (03) 保持レジスタの内容を読み込みます。
ReadInputRegister (04) 入力レジスタの内容を読み込みます。
WriteSingleCoil (05)) 1つのDO(Discrete Output)へ書き込みを行います。
WriteSingleRegister (06) 1つの保持レジスタへ書き込みを行います。
WriteMultipleCoils (15)) 連続したDO(Discrete Output)へ書き込みを行います。
WriteMultipleRegisters (16) 連続した保持レジスタへ書き込みを行います。
Version 本DLLのバージョン情報を取得します。
コールバック関数 実行結果は、コールバック関数で取得します。

カッコ内の数字は、ファンクションコードです。

2-2.数値変換

modbus通信におけるクライアントとの読み込み、書き込みデータは、16ビット整数の配列データで行われます。 modbus通信にて32ビット整数、文字列、実数が使用されている場合は、以下の数値変換関数にて相互変換を行うことが出来ます。

関数名 説明
D2ToDW 2つのワード値(16ビット整数)をダブルワード値(32ビット整数)に変換します。
DWToD2 ダブルワード値(32ビット整数)を2つのワード値(16ビット整数)に変換します。
DarToStr ワード配列(16ビット整数)による文字列を文字列(string)に変換します。文字コードは、Shift_JISとなります。
StrToDar 文字列(string)をワード配列(16ビット整数)による文字列に変換します。文字コードは、Shift_JISとなります。
D2ToFloat 2つのワード値(16ビット整数)を実数(単精度)に変換します。
FloatToD2 実数(単精度)を2つのワード値(16ビット整数)に変換します。

3.デバイス

modbus でのデバイスは、一般的に以下となります。

デバイス種別 単位 読出し/書込み デバイス番号
コイル ビット 読出し/書込み 1 ~ *****
入力 ビット 読出し 1***1 ~ 1****
入力レジスタ ワード 読出し 3***1 ~ 3****
保持レジスタ ワード 読出し/書込み 4***1 ~ 4****

デバイス番号の桁数は、接続する機器(スレーブ機器)により異なります。通常、プログラムでのデバイス番号は、 0~ の数字となります。 例 保持レジスタ 40007 の場合は 6 を指定します。(40007 - 40001 = 6) 運用時は、 接続機器の取扱説明書を参照して下さい。

4.プログラム例

modbus の RTU モードにより三菱 PLC iQ-R の RJ71C24 と通信を行う C#のプログラム例を以下に示します。 RJ71C24 の MODBUS デバイス割り付けは、以下となります。

項目 コイル 入力 入力レジスタ 保持レジスタ
デバイスコード M X W D
先頭デバイス番号 (16進) 64 100 100 64
先頭MODBUSデバイス番号 0 0 0 0
割付点数 20 32 16 20

以下のプログラムでは、エラー処理を省略しています。


// modbusRTU C# 例
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace CSSmpl
{
   public partial class Form1 : Form
   {
      Modbus.modBusRTU mBusRTUd;
      public Form1()
      {
         InitializeComponent();
      }

   // form load
      private void Form1_Load(object sender, EventArgs e){

         mBusRTUd = new Modbus.modBusRTU();
         int ir = mBusRTUd.KeyCodeChk("キーコード");
         if (ir != 0){
            MessageBox.Show("キーコードエラー", "Modbus.dll", MessageBoxButtons.OK, MessageBoxIcon.Error);
         }
      }

   // open
      private void button1_Click(object sender, EventArgs e){

         Modbus.Rs232Parat rs232parad = new Modbus.Rs232Parat();
         rs232parad.iComNo = 3;
         rs232parad.uiBauRate = Modbus.BaudRate._CBR_9600;
         rs232parad.cByteSize = 8;
         rs232parad.byStopBits = Modbus.STOPBIT._ONESTOPBIT;
         rs232parad.byParity = Modbus.PARITY._ODDPARITY;
         int ir = mBusRTUd.Open(rs232parad, CallBack);
         textBox1.Text = ir.ToString();
      }

   // close
      private void button2_Click(object sender, EventArgs e){

         mBusRTUd.Close();
      }

   // 局番設定
      private void button7_Click(object sender, EventArgs e){

         int ir = mBusRTUd.SetAddress(1);
         textBox1.Text = ir.ToString();
      }

   // Read Coils 01
      private void button8_Click(object sender, EventArgs e){

         int ir = mBusRTUd.ReadCoils(0, 20);     // M100~ M119 読み込み
         textBox1.Text = ir.ToString();
      }

   // read discrete input 02
      private void button3_Click(object sender, EventArgs e){

         int ir = mBusRTUd.ReadDiscreteInput(0, 32);     // X100~X11F 読み込み
         textBox1.Text = ir.ToString();
      }

   // read holding register 03
      private void button4_Click(object sender, EventArgs e){

         int ir = mBusRTUd.ReadHoldingRegister(0, 20);   // D100~D119 読み込み
         textBox1.Text = ir.ToString();
      }

   // read input register 04
      private void button9_Click(object sender, EventArgs e){

         int ir = mBusRTUd.ReadInputRegister(0, 16);     // W100~W10F 読み込み
         textBox1.Text = ir.ToString();
      }

   // write single coil 05
      private void button10_Click(object sender, EventArgs e){

         int ir = mBusRTUd.WriteSingleCoil(2, true);       // M102 ON
         textBox1.Text = ir.ToString();
      }

   // write single register 06
      private void button11_Click(object sender, EventArgs e){

         int ir = mBusRTUd.WriteSingleRegister(5, 12345);  // D105 12345書込み
         textBox1.Text = ir.ToString();
      }

   // write multiple coils 15
      private void button5_Click(object sender, EventArgs e){

         Int16[] idt = new Int16[5]{1,0,1,0,1};
         int ir = mBusRTUd.WriteMultipleCoils(0, idt);   // M100 ~ M104 書込み
         textBox1.Text = ir.ToString();
      }

   // write multiple register 16
      private void button6_Click(object sender, EventArgs e){

         Int16[] idt = new Int16[4]{1, 10, 123, 2345};
         int ir = mBusRTUd.WriteMultipleRegisters(0, idt); // D100 ~ D103 書込み
         textBox1.Text = ir.ToString();  
      }

   // callback
      public bool CallBack(int iErrCd, int iFuncCd, Int16[] iData, int iComNO){

         if (iErrCd != 0){
            textBox2.Text = iErrCd.ToString("X");
            return true;
         }
         if ((iFuncCd & 0x80) != 0){
            textBox2.Text = "異常応答コード " + iData[0].ToString();
         }
         if (iFuncCd == 0x05 || iFuncCd == 0x06 || iFuncCd == 0x0f || iFuncCd == 0x10){
            textBox2.Text = "書込完了";
         }
         if (iFuncCd == 0x01 || iFuncCd == 0x02 || iFuncCd == 0x03 || iFuncCd == 0x04){
            int il = iData.Length;
            string sv = string.Empty;
            for(int ia = 0; ia < il; ia++)
               sv += iData[ia].ToString() + ",";
            textBox2.Text = sv;
         }
         return true;
      }
   }
}
            

5.開発、実行環境

本DLL(Modbus.dll,modbus/TCP.dll)の実行には、.NET Framework4.5 が必要です。

内容

  • Modbusシリアル通信用DLL 64ビット、32ビット用
  • Modbus/TCP通信用DLL 64ビット、32ビット用
  • HELPファイル

6.購入方法等

  1. 税抜き価格 ¥35,000.-
  2. 銀行振り込み確認後、メールにて送付します。

購入、問い合わせ等は下記のお問い合わせよりお願いします。
お問い合わせ