本ソフトウエアは、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.購入方法等
- 税抜き価格 ¥35,000.-
- 銀行振り込み確認後、メールにて送付します。
購入、問い合わせ等は下記のお問い合わせよりお願いします。
お問い合わせ
