Membuat Driver Modbus dengan Fitur Scaling Berdasarkan Driver Modbus Rapid SCADA

Panduan copy-then-modify untuk menghindari ketergantungan pada upstream, tanpa perlu rumit mengajukan pull request, dan mendapatkan kendali penuh atas driver yang sesuai kebutuhan.

Membuat Driver Modbus dengan Fitur Scaling Berdasarkan Driver Modbus Rapid SCADA
Photo by Carlos Gonzalez / Unsplash

Ditulis oleh Ketut Kumajaya — 14 Mei 2026

Pendahuluan

Rapid SCADA menyediakan driver DrvModbus yang handal untuk komunikasi Modbus. Namun, menambahkan fitur khusus seperti scaling (penskalaan nilai raw register ke nilai engineer) memerlukan perubahan kode sumber asli dan proses pull request yang rumit. Solusi praktis adalah menyalin seluruh driver asli lalu memodifikasinya menjadi driver mandiri, misalnya DrvSigModbus. Artikel ini memandu langkah demi langkah, termasuk mengintegrasikan fitur scaling dari PR #105 dan perbaikan validasi.

Prasyarat

  • Windows + VSCode dengan Git Bash (termasuk GNU tools: sed, grep, find)
  • .NET SDK 8.0
  • Kode sumber Rapid SCADA v6 sudah di-clone

Langkah 1 – Menyalin Folder Driver Asli

Di terminal Git Bash, masuk ke ScadaComm/OpenDrivers:

cp -r DrvModbus.Common  DrvSigModbus.Common
cp -r DrvModbus.Logic   DrvSigModbus.Logic
cp -r DrvModbus.View    DrvSigModbus.View

Langkah 2 – Mengganti Nama File Proyek dan File Utama

2.1 Rename file .csproj

mv DrvSigModbus.Common/DrvModbus.Common.csproj  DrvSigModbus.Common/DrvSigModbus.Common.csproj
mv DrvSigModbus.Logic/DrvModbus.Logic.csproj    DrvSigModbus.Logic/DrvSigModbus.Logic.csproj
mv DrvSigModbus.View/DrvModbus.View.csproj      DrvSigModbus.View/DrvSigModbus.View.csproj

2.2 Rename file .cs dan .xml yang mengandung DrvModbus / DevModbus

mv DrvSigModbus.Logic/DrvModbusLogic.cs         DrvSigModbus.Logic/DrvSigModbusLogic.cs
mv DrvSigModbus.Logic/DevModbusLogic.cs         DrvSigModbus.Logic/DevSigModbusLogic.cs

mv DrvSigModbus.View/DrvModbusView.cs           DrvSigModbus.View/DrvSigModbusView.cs
mv DrvSigModbus.View/DevModbusView.cs           DrvSigModbus.View/DevSigModbusView.cs

mv DrvSigModbus.View/Lang/DrvModbus.en-GB.xml   DrvSigModbus.View/Lang/DrvSigModbus.en-GB.xml
mv DrvSigModbus.View/Lang/DrvModbus.ru-RU.xml   DrvSigModbus.View/Lang/DrvSigModbus.ru-RU.xml

Catatan: File seperti ModbusCmd.cs, ModbusUtils.cs, ElemGroup.cs tidak perlu di-rename karena bersifat generik.

2.3 Tambahkan berkas terjemahan Bahasa Indonesia

Buat file DrvSigModbus.View/Lang/DrvSigModbus.id-ID.xml dengan konten (contoh, bisa diambil dari patch asli):

<?xml version="1.0" encoding="utf-8" ?>
<DrvSigModbusDictionaries>
  <Dictionary key="Scada.Comm.Drivers.DrvSigModbus.View.Controls.CtrlElem">
    <Phrase key="lblElemScaling">Skala</Phrase>
    <Phrase key="lblElemScalingExample">Misalnya, 0;65535;0;35</Phrase>
    <!-- tambahkan semua frase sesuai kebutuhan -->
  </Dictionary>
  <!-- dictionary lainnya -->
</DrvSigModbusDictionaries>

2.4 Sesuaikan berkas proyek (.csproj)

Buka DrvSigModbus.View/DrvSigModbus.View.csproj dan pastikan ada baris berikut di dalam <ItemGroup>:

<None Update="Lang\DrvSigModbus.ru-RU.xml">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Lang\DrvSigModbus.en-GB.xml">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
<None Update="Lang\DrvSigModbus.id-ID.xml">
  <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>

Langkah 3 – Mengganti Isi File (Namespace, String, Referensi)

Gunakan sed untuk mengganti semua kemunculan nama lama:

find DrvSigModbus.* -type f \( -name "*.cs" -o -name "*.csproj" -o -name "*.xml" \) | \
xargs sed -i \
  -e 's/DrvModbus/DrvSigModbus/g' \
  -e 's/DevModbus/DevSigModbus/g'

Verifikasi tidak ada yang tersisa:

grep -r "DrvModbus\|DevModbus" DrvSigModbus.* --include="*.cs" --include="*.csproj" --include="*.xml"

(Output harus kosong)

Langkah 4 – Menambahkan Proyek ke Solution

dotnet sln OpenDrivers.sln add \
  DrvSigModbus.Common/DrvSigModbus.Common.csproj \
  DrvSigModbus.Logic/DrvSigModbus.Logic.csproj \
  DrvSigModbus.View/DrvSigModbus.View.csproj

Langkah 5 – Build Baseline dan Commit

dotnet build DrvSigModbus.Logic/DrvSigModbus.Logic.csproj
dotnet build DrvSigModbus.View/DrvSigModbus.View.csproj

Pastikan tidak ada error. Lalu commit:

git add .
git commit -m "Add DrvSigModbus as baseline copy of DrvModbus"

Langkah 6 – Menambahkan Fitur Scaling dari PR #105

6.1 Dari root project Rapid SCADA, unduh patch dan adaptasi ke DrvSigModbus

curl -L https://github.com/kumajaya/scada-v6/commit/ce3f6324822f3295fb8e6f412a7a13412ee5cdc7.patch \
  | sed -e 's|DrvModbus\.Common|DrvSigModbus.Common|g' \
        -e 's|DrvModbus\.Logic|DrvSigModbus.Logic|g' \
        -e 's|DrvModbus\.View|DrvSigModbus.View|g' \
        -e 's|DevModbusLogic|DevSigModbusLogic|g' \
        -e 's|DrvModbus\.en-GB|DrvSigModbus.en-GB|g' \
        -e 's|DrvModbus\.ru-RU|DrvSigModbus.ru-RU|g' \
  > /tmp/sigmodbus-scaling.patch

6.2 Terapkan patch

git apply --check /tmp/sigmodbus-scaling.patch   # dry-run
git apply /tmp/sigmodbus-scaling.patch

6.3 Build ulang dan commit

dotnet build ScadaComm/OpenDrivers/DrvSigModbus.Logic/DrvSigModbus.Logic.csproj
dotnet build ScadaComm/OpenDrivers/DrvSigModbus.View/DrvSigModbus.View.csproj
git add .
git commit -m "DrvSigModbus: add scaling feature for UShort/Short registers"

Langkah 7 – Perbaikan Validasi (Overflow dan UI)

7.1 Di ModbusCmd.cs (mencegah overflow pada reverse scaling)

Cari metode SetCmdData, setelah Math.Round(rawVal, 0) tambahkan:

if (ElemType == ElemType.UShort && (rawVal < 0 || rawVal > 65535))
    throw new ArgumentException($"Scaled value {rawVal} is out of range for UShort (0-65535).");
if (ElemType == ElemType.Short && (rawVal < -32768 || rawVal > 32767))
    throw new ArgumentException($"Scaled value {rawVal} is out of range for Short (-32768-32767).");

7.2 Validasi input di UI (CtrlElem.cs dan CtrlCmd.cs)

  • Tambahkan using System.Drawing;
  • Pada event handler txtScaling_TextChanged (atau txtCmdScaling_TextChanged), lakukan validasi format (4 angka, min≠max) dan beri warna latar merah jika salah. Contoh:
try
{
    double[] scaling = ModbusUtils.ParseDoubleArray(scalingText);
    if (scaling.Length != 4 || scaling[0] == scaling[1] || scaling[2] == scaling[3])
        txtElemScaling.BackColor = Color.LightCoral;
    else
    {
        elemTag.Elem.Scaling = scalingText;
        txtElemScaling.BackColor = SystemColors.Window;
    }
}
catch
{
    txtElemScaling.BackColor = Color.LightCoral;
}

7.3 Amend commit terakhir

git add .
git commit --amend --no-edit

Langkah 8 – Memperbarui Deskripsi Driver

Buka DrvSigModbus.View/DrvSigModbusView.cs dan ubah properti Descr menjadi:

public override string Descr
{
    get
    {
        return Locale.IsRussian ?
            "Взаимодействует с контроллерами по протоколу Modbus с поддержкой масштабирования.\n\n" +
            ... :
            "Interacts with controllers via Modbus protocol with scaling support.\n\n" +
            ...;
    }
}

Amend commit terakhir:

git add .
git commit --amend --no-edit

Langkah 9 – Membangun dan Men-deploy Driver

dotnet build ScadaComm/OpenDrivers/DrvSigModbus.Logic/DrvSigModbus.Logic.csproj -c Release
dotnet build ScadaComm/OpenDrivers/DrvSigModbus.View/DrvSigModbus.View.csproj -c Release

cp ScadaComm/OpenDrivers/DrvSigModbus.Logic/bin/Release/netstandard2.0/DrvSigModbus.Common.dll  "C:/Program Files/SCADA/ScadaComm/Drv/"
cp ScadaComm/OpenDrivers/DrvSigModbus.Logic/bin/Release/netstandard2.0/DrvSigModbus.Logic.dll   "C:/Program Files/SCADA/ScadaComm/Drv/"

cp ScadaComm/OpenDrivers/DrvSigModbus.View/bin/Release/net8.0-windows/DrvSigModbus.Common.dll   "C:/Program Files/SCADA/ScadaAdmin/Lib/"
cp ScadaComm/OpenDrivers/DrvSigModbus.View/bin/Release/net8.0-windows/DrvSigModbus.View.dll     "C:/Program Files/SCADA/ScadaAdmin/Lib/"
cp ScadaComm/OpenDrivers/DrvSigModbus.View/bin/Release/net8.0-windows/Lang/DrvSigModbus.*.xml   "C:/Program Files/SCADA/ScadaAdmin/Lang/"

Restart layanan ScadaComm6. Kemudian buka ScadaAdminConfiguration DatabaseSecondary TablesDevice Types, tambah baris baru:

  • Name: Sig Modbus
  • Driver: DrvSigModbus

Saat membuat perangkat, pilih Device Type = Sig Modbus.

Langkah 10 – Menghasilkan Patch Final

Untuk distribusi atau arsip:

git format-patch -1 HEAD --stdout > sigmodbus-scaling-final.patch

Patch ini dapat diterapkan di repositori lain dengan git am.


Kesimpulan

Dengan panduan ini, Anda memiliki driver DrvSigModbus yang mandiri, mendukung scaling linear untuk UShort/Short, validasi overflow, UI responsif, dan tiga bahasa (Inggris, Rusia, Indonesia).

Pendekatan copy then modify dipilih untuk menghindari ketergantungan pada upstream, tanpa perlu mengajukan PR, serta memberikan kendali penuh atas kode. Perubahan dari upstream dapat diadaptasi secara manual sesuai kebutuhan. Strategi ini pragmatis, kokoh, dan ideal untuk lingkungan industri yang mengutamakan stabilitas.