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.
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.cstidak 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(atautxtCmdScaling_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 ScadaAdmin → Configuration Database → Secondary Tables → Device 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.