You are on page 1of 110

LAMPIRAN A

PENGECEKAN HASIL TURNITIN


LAMPIRAN B
DATASHEET
LAMPIRAN C
RANGKAIAN
Rangkaian Minimum System RTU STM32F407
Rangkaian Reset

+3V3

U3A
R4 PA0_UC2 23 35 PB0_UC2
100K PA0-WKUP(PA0) PB0
PA1_UC2 24 36 PB1_UC2
PA1 PB1
PA2_UC2 25 37 BOOT1_UC2
PA2 PB2-BOOT1(PB2)
PA3_UC2 26 89 SPI1_SCK
PA3 PB3(JTDO/TRACESWO)
NRST_UC2 PA4_UC2 29 90 SPI1_CS1
PA4 PB4(NJTRST)
PA5_UC2 30 91 SPI1_MOSI
PA5 PB5
PA6_UC2 31 92 I2C1_SCL
S1 PA6 PB6
PA7_UC2 32 93 I2C1_SDA
C1 SW-PB PA7 PB7
100nF DO_1_UC 67 95 SEL_ID_RTU
PA8 PB8
USB_FS_VBUS_UC2 68 96 DIP_SW_D7
PA9 PB9
USB_FS_ID_UC2 69 47 DI_6_Uc
PA10 PB10
USB_FS_DM_UC2 70 48 PB11_UC2
PA11 PB11
USB_FS_DP_UC2 71 51 PB12_UC2
PA12 PB12
SWDIO_UC2 72 52 PB13_UC2
GND PA13(JTMS-SWDIO) PB13
SWDCLK_UC2 76 53 DI_5_Uc
PA14(JTCK-SWCLK) PB14
SPI3_CS 77 54 DI_4_Uc
PA15(JTDI) PB15
PC0_UC2 15 81 PD0_UC2
PC0 PD0
PC1_UC2 16 82 PD1_UC2
PC1 PD1
PC2_UC2 17 83 PD2_UC2
PC2 PD2
PC3_UC2 18 84 PD3_UC2
PC3 PD3
J2 PC4_UC2 33 85 DATA_CONTROL_MAX485
PC4 PD4
GND PC5_UC2 34 86 USART2_TX
1 PC5 PD5
SWDIO_UC2 USART6_TX 63 87 USART2_RX
2 PC6 PD6
SWDCLK_UC2 USART6_RX 64 88 SPI1_CS2
3 PC7 PD7
SWD

+3V3
4
DO_3_UC 65 55 DI_3_Uc
PC8 PD8
DO_2_UC 66 56 DI_2_Uc
PC9 PD9
SPI3_SCK 78 57 DI_1_Uc
PC10 PD10
SPI3_MISO 79 58 DO_8_UC
PC11 PD11
OSC32_OUT_UC2 SPI3_MOSI 80 59 DO_7_UC
PC12 PD12
PC13_UC2 7 60 DO_6_UC
PC13 PD13
OSC32_IN_UC2 OSC32_IN_UC2 8 61 DO_5_UC OSCIN_UC2
PC14-OSC32_IN(PC14) PD14
OSC32_OUT_UC2 9 62 DO_4_UC OSCOUT_UC2
PC15-OSC32_OUT(PC15) PD15
32.768K
DIP_SW_D6 97 Y1
PE0
DIP_SW_D5 98 12 OSCIN_UC2
PE1 PH0-OSC_IN(PH0)
Y2 DIP_SW_D4 1 13 OSCOUT_UC2
C2 C3 PE2 PH1-OSC_OUT(PH1)
DIP_SW_D3 2 8MHz
20pF 20pF PE3 C4 C5
DIP_SW_D2 3 94 BOOT0_UC2
PE4 BOOT0 20pF 1uF
DIP_SW_D1 4
PE5
DIP_SW_D0 5 14 NRST_UC2
PE6 NRST
DI_15_Uc 38
GND PE7
49 VCAP_1_UC2
VCAP_1 GND
DI_14_Uc 39 73 VCAP_2_UC2
PE8 VCAP_2
DI_13_Uc 40
PE9
DI_12_Uc 41
PE10 C6 C7
DI_11_Uc 42
PE11 2.2uF 2.2uF
DI_10_Uc 43
PE12
DI_9_Uc 44
PE13
JP2 JUMPER DI_8_Uc 45
PE14 GND GND
DI_7_Uc 46
PE15
STM32F407VGT6
1

J3 +5V_USB
1 R33 100 USB_FS_VBUS_UC2
CONNECTOR_USB

V+
2 R34 100 USB_FS_DM_UC2
D-
3 R35 10K USB_FS_DP_UC2
D+
4
GND
GND
GND

GND
6
5

GND Module Ethernet TAMPER RTC Rangkaian Konfigurasi Boot

+3V3 +3V3
JP5
PD1_UC2
1 +3V3
PD0_UC2
2
SPI3_MOSI
HEADER 10

3 R42 R43
A

SPI3_MISO 10K 10K


4
SPI3_SCK D25
5
SPI3_CS LED_SMD
6
+3V3
7 BOOT0_UC2 BOOT1_UC2
+5V
8
GND R48
C

9 PC13_UC2
GND R49 R50
10 100
510 510

1 JP3 1 JP4

2 2
JUMPER JUMPER
GND GND

J22 JMP_BATT
1
2

U3B +3V3
VBAT_RTC_STM 6 21
VBAT VREF+
C16 C17 C18 C19 C20 C21 C22 C23 11
100nF 100nF 100nF 100nF 100nF 100nF 100nF 100nF +3V3 VDD C24 C25
19
VDD 100nF 1uF
28 10
BT1 VDD VSS
50 27
3V GND VDD VSS
75 74
VDD VSS GND
100 99
VDD VSS GND
+3V3
22 20
VDDA VSSA
GND C14 C15 STM32F407VGT6
100nF 1uF

GND

Keterangan:
RANGKAIAN SISTEM MINIMUM
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-001
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
IC-REG-AMS1117
F1 U 1 IC-REG-78XX +5V U2 +3V3
1 3 3 2 R62

GND

GND
IN OUT IN OUT
4K7

A
FUSE2 +3V3 J13
D40 C8 C9 C10 C11 C12 C13 D41
2 1

3V3
DIODE 100N 100N 100uf 100N 100N 100uf LED_SMD
2

C
GND

GND GND GND GND GND GND GND GND


GND GND

U30 +5V
L1 R142
1 2
VIN OUT
J4 5 33uH

D56
4K7

A
ON /OFF
+Vin 3 4
1 GND FB
Input DC

C26
2 220uF ICREGULATOR3A
C28 C29 C50

LED_SMD
D52 100n 100uf 100uf

C
GND GND GND DIODE SCHOTTKY

GND

GND GND GND GND

U31 +3V3
L2
1 2
VIN OUT
5 33uH
ON /OFF
3 4
GND FB
ICREGULATOR3A
C27 C30 C51
D53
100n 100uf 100uf
DIODE SCHOTTKY
GND

GND
GND GND GND

R143 1K
R144 500

U42 +V_ADJ
L3 R145
1 2
VIN OUT
5 33uH 4K7
A

ON /OFF
3 4
GND FB D58
ICREGULATOR3A LED_SMD
C48 C49
D57 100n 100uf
C

GND DIODE SCHOTTKY

GND

GND GND GND

Keterangan:
RANGKAIAN DC TO DC
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-002
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
+3V3

U1
R1 8
10K VCC
7 +5V
VB R2
2
A
USART2_RX 6 330
C
3 RX_OPTO
C
5
E
IC_6N136 +5V

GND
+3V3
+5V R16
20k
USART2_RX_5V
R3 U27 U28 +5V
330 8 R6 1 8 J1
VCC 10K RO +5V
2 7 MAX485_B
RE B 1
7 3 6 MAX485_A
VB DE A 2

RS485
2 4 5
A DI GND 3
6 TX_OPTO
C
MAX 485
USART2_TX 3 GND R17 GND
C 10K
5
E
IC_6N136
1 JP1
GND
GND
+3V3 2
+5V JUMPER
R18
R8 120
330 R11
10K
U29
1 6
A B
5
C
DATA_CONTROL_MAX485 2
C
3
NC 4
E
IC-4N35
GND

Keterangan:
RANGKAIAN KOMUNKASI RS485
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-003
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
RTC DS1307 DAN EEPROM DATA CONCENTRATOR
+5V +5V

+3V3 +5V

R112 R113
R114 R115 4K7 10K
10K 10K
G

GND
Q1 +5V U34
8 1
+5V S0
I2C1_SDA SDA1_H_UC1 7 2
WP S1
SCL1_H_UC1 6 3
SCL S2
D
S

BSS138 SDA1_H_UC1 5 4
SDA GND
IC-AT24C256
+3V3 +5V GND

+5V
R116 R117
10K 10K
G

Q3
8

U35 C44
I2C1_SCL SCL1_H_UC1 SCL1_H_UC1 6 IC-DS1307
SCL
+5V

SDA1_H_UC1 5 1
SDA X1
D
S

BSS138 Y3 18pF

32.768KHz
GND
7 2 C45
GND SOUT X2
+5V
GND

VBAT_RTC_STM 3
VBAT
18pF
C47 C46
4

100nF 100nF

GND
GND

Keterangan:
RANGKAIAN RTC DAN EEPROM
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-004
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
U36
+5V
1 14 VOUT_DAC2
VDD VOUT A
10 VOUT_DAC1
VOUT B
13
VREF A
11
VREF B

MCP4922
SPI1_MOSI R118 1 5
SDI
SPI1_SCK R119 1 4 2
SCK NC
SPI1_CS1 R120 1 3 6
CS NC
7
NC
8
LDAC
9 12
SHDN VSS

DACMCP4922 GND
GND
+V_ADJ
J8
1

V/I
2

R125
150

R126
250

R127
100

+V_ADJ
Analog_OUT1
+V_ADJ
U38B
8

DQ4
LM358P
8

U38A 6 XXXX
2 LM358P 7 G
B
1 5
A
VOUT_DAC1 3 S
4
4

GND
GND

R124
500

GND

Keterangan:
RANGKAIAN DAC MCP4922
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-005
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
RX_OPTO

+5V C39 C40 +5V


R110

R108
+5V 1
1 DCD 1 uf 1 uf
R109

6 DSR
+5V
J23

2 RXD_RS232 GND

16
2
6
7 RTS U32

RES1
3 TXD_RS232 13 12 D54
DB9

R1IN V- R1OUT
VCC
V+
8 CTS TXD_RS2328 9
R2IN R2OUT
RES1

4 DTR 11 14 LED
T1IN T1OUT
9 RI 10 7 RXD_RS232
T2IN T2OUT
5 GND D55 LED 1 3
GND

C1+ C1-
4 5
C2+ C2-
+5V
IC-MAX232
15

TX_OPTO R111 1
C43
100nF
J24 GND
RXD_RS232
1 GND
TXD_RS232 C41 1uF
+
RS232

2
3
C42 1uF
+

GND

Keterangan:
RANGKAIAN KOMUNIKASI RS232
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-006
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
+3V3

U33
ESP-8266

7
VCC
TX_ESP8266 1
TX
RX_ESP8266 8 6

ESP-8266
RX GPIO_0
4
GPIO_2
3
CH_PD
RST_ESP8266 5
RST

GND
S3 1 TX_ESP8266
USART6_RX R140 1 2
3 TX_SIM900

2
6 RX_ESP8266
USART6_TX R141 1 5
4 RX_SIM900
SW-DPDT GND

M1 MODULE SIM900
+5V
1
VCC

MODULE SIM900
2
DTR
TX_SIM900 3
TX
RX_SIM900 4
RX
5
SPEAKER
6
MICROPHONE
7
RESET
8
GND

GND

Keterangan:
RANGKAIAN MODUL SIM900 DAN ESP8266
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-007
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
DIP SWITCH

S2
16 1 DIP_SW_D0
15 2 DIP_SW_D1
14 3 DIP_SW_D2
13 4 DIP_SW_D3
12 5 DIP_SW_D4
11 6 DIP_SW_D5
10 7 DIP_SW_D6
9 8 DIP_SW_D7

SW-DIP8
GND

J5
SELECT_ID

SEL_ID_RTU
1
2

GND

Keterangan:
RANGKAIAN DIP SWITCH
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-008
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
+3V3

R7
1K

A
D2
LED_SMD

U4
R13

C
DI_1_In 10K D5 DIODE 1 4 DI_1_Uc
A C

Com_DI_1 2
C
3
E
IC-P521
GND

Keterangan:
RANGKAIAN DIGITAL INPUT
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-009
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
+3V3

+5V_RLY

D1 RLY_COM1
LED

D4
1N4007 K1
RELAY-DPDT_N
+3V3 +5V

NC2

NO2
NC1

NO1
R5 U2
1K 1 4
A C
NO_RLY1

DO_1_UC R10 561 2 Q2


C NPN NC_RLY1
3 R12 2K2
E
IC-P521

R15
10K

GND GND

Keterangan:
RANGKAIAN DIGITAL OUTPUT
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-010
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
ANALOG_IN1 R84 PB0_UC2
150k
R86 R87
110 39k C31
100N
J14
mA
1 GND
GND 2
V
3
CONECTOR3

Keterangan:
RANGKAIAN ANALOG INPUT
RTU
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 RTU-ARM-011
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
JP9 JUMPER

+5V

2
U1A
J1 PA0_UC1 23 35 PB0_UC1
PA0-WKUP(PA0) PB0
1 PA1_UC1 24 36 PB1_UC1
CONNECTOR_USB

V+ PA1 PB1
2 R6 100 USB_HS_DM_UC1 PA2_UC1 25 37 BOOT1_UC1
D- PA2 PB2-BOOT1(PB2)
3 R7 100 USB_HS_DP_UC1 PA3_UC1 26 89 SPI3_SCK_UC1
D+ PA3 PB3(JTDO/TRACESWO)
4 PA4_UC1 29 90 SPI3_MISO_UC1
GND PA4 PB4(NJTRST)
PA5_UC1 30 91 SPI3_MOSI_UC1
PA5 PB5
PA6_UC1 31 92 I2C1_SCL
GND
GND

GND PA6 PB6


PA7_UC1 32 93 I2C1_SDA
PA7 PB7
PA8_UC1 67 95 SEL_ID
PA8 PB8
6
5

USB_FS_VBUS_UC1 68 96 DIP_SW_D7
PA9 PB9
USB_FS_ID_UC1 69 47 PB10_UC1
PA10 PB10
USB_FS_DM_UC1 70 48 PB11_UC1
PA11 PB11
USB_FS_DP_UC1 71 51 PB12_UC1
GND PA12 PB12
SWDIO_UC1 72 52 PB13_UC1
PA13(JTMS-SWDIO) PB13
SWDCLK_UC1 76 53 USB_HS_DM_UC1
PA14(JTCK-SWCLK) PB14
PA15_UC1 77 54 USB_HS_DP_UC1 J20
PA15(JTDI) PB15

CONECTOR4
PB11_UC1 R73 RES1
1
PC0_UC1 15 81 PD0_UC1 PB10_UC1 R72 RES1
PC0 PD0 2
PC1_UC1 16 82 PD1_UC1
PC1 PD1 +5V 3
PC2_UC1 17 83 PD2_UC1
PC2 PD2 4
PC3_UC1 18 84 PD3_UC1
PC3 PD3
J2 PC4_UC1 33 85 PD4_UC1
PC4 PD4 GND
+3V3 PC5_UC1 34 86 PD5_UC1
1 PC5 PD5
SWDCLK_UC1 PC6_UC1 63 87 PD6_UC1
2 PC6 PD6
SWDIO_UC1 PC7_UC1 64 88 PD7_UC1
3 PC7 PD7
SWD

GND
4
PC8_UC1 65 55 PD8_UC1
PC8 PD8
PC9_UC1 66 56 PD9_UC1
PC9 PD9
PC10_UC1 78 57 PD10_UC1
PC10 PD10
PC11_UC1 79 58 PD11_UC1
PC11 PD11
OSC32_OUT_UC1 PC12_UC1 80 59 PD12_UC1
PC12 PD12
PC13_UC1 7 60 PD13_UC1
PC13 PD13
OSC32_IN_UC1 OSC32_IN_UC1 8 61 PD14_UC1 OSCIN_UC1
PC14-OSC32_IN(PC14) PD14
OSC32_OUT_UC1 9 62 PD15_UC1 OSCOUT_UC1
PC15-OSC32_OUT(PC15) PD15
32.768K
DIP_SW_D6 97 Y2
PE0
DIP_SW_D5 98 12 OSCIN_UC1
PE1 PH0-OSC_IN(PH0)
Y3 DIP_SW_D4 1 13 OSCOUT_UC1
C5 C6 PE2 PH1-OSC_OUT(PH1)
DIP_SW_D3 2 8MHz
20pF 20pF PE3 C7 C8
DIP_SW_D2 3 94 BOOT0_UC1
PE4 BOOT0 20pF 20pF
DIP_SW_D1 4
PE5
DIP_SW_D0 5 14 NRST_UC1
PE6 NRST
PE7_UC1 38
GND PE7
49 VCAP_1_UC1
VCAP_1 GND
PE8_UC1 39 73 VCAP_2_UC1
PE8 VCAP_2
PE9_UC1 40
PE9
PE10_UC1 41
PE10 C9 C10
PE11_UC1 42
PE11 2.2uF 2.2uF
PE12_UC1 43
PE12
PE13_UC1 44
PE13
JP1 JUMPER PE14_UC1 45
PE14 GND GND
PE15_UC1 46
PE15
STM32F407VGT6
1

J4 +5V
1
CONNECTOR_USB

V+
2 R14 10K USB_FS_DM_UC1
D-
3 R15 100 USB_FS_DP_UC1
D+
4
GND
GND
GND

GND
6
5

GND J16
PA5_UC1
1
PA6_UC1
2
PA7_UC1
3
PC4_UC1
CONECTOR10

4
PC5_UC1
5
PB0_UC1
6
PB1_UC1
Rangkaian Reset Rangkaian Konfigurasi Boot +3V3
7
8
+5V
9
GND
10
+3V3
+3V3 +3V3

R22
100K R23 R24
10K 10K

NRST_UC1
BOOT0_UC1 BOOT1_UC1

S1
J18 C11 SW-PB R25 R26
100nF 510 510
RESET

1
J19
2
CONECTOR3

PD2_UC1
JP3 JP4 1
1 1 PC12_UC1
2
3
GND GND 2 2
JUMPER JUMPER GND

GND GND

Keterangan:
RANGKAIAN SISTEM MINIMUM
Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-001
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
IC-REG-AMS1117
F1 U 1 IC-REG-78XX +5V U2 +3V3
1 3 3 2 R49

GND

GND
IN OUT IN OUT
4K7

A
FUSE2 +3V3 J11
D3 C29 C30 C31 C32 C33 C34 D4
1

3V3
DIODE 100N 100N 100uf 100N 100N 100uf LED_SMD
2

C
GND

GND GND GND GND GND GND GND GND


GND GND

U8 +5V
L1 R50
1 2
VIN OUT
J12 5 33uH 4K7

A
ON /OFF

D5
+Vin 3 4
1 GND FB
Input DC

C35
2 220uF ICREGULATOR3A
C36 C37 C38

LED_SMD
D6 100n 100uf 100uf

C
GND GND GND DIODE SCHOTTKY

GND

GND GND GND GND

U9 +3V3
L2
1 2 +3V3 J24
VIN OUT

V_ADJ
5 33uH
ON /OFF 1
3 4
GND FB 2
ICREGULATOR3A
C39 C40 C41 GND
D7
100n 100uf 100uf
DIODE SCHOTTKY
GND +3V3 J25

V_ADJ
1
2

GND
GND
GND GND GND

+V_ADJ J21 +V_ADJ J22

V_ADJ

V_ADJ
1 1
R51 1K
2 2
R52 500

GND GND
U10 +V_ADJ
L3 R53
1 2
VIN OUT
5 33uH 4K7 +V_ADJ J23
A

ON /OFF

V_ADJ
3 4
GND FB D8 1
LED_SMD 2
ICREGULATOR3A
C42 C43
D9 100n 100uf GND
C

GND DIODE SCHOTTKY

GND

GND GND GND

Keterangan:
RANGKAIAN POWER SUPPLY
Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-002
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
+3V3 +5V

R27 R28 +5V


20k
G

10K
Q6

PD6_UC1 R29
20k
D
S

BSS138
U5 +5V
+3V3 +5V 1 8 J6
RO +5V
2 7
RE B 3
3 6
DE A 2
4 5
R30 DI GND 1
R31
10K 100
G

MAX 485 RS485


Q7 GND R32 GND
10K
PD4_UC1 R67
10K
S

BSS138
1 JP5
+3V3 +5V
GND
2
JUMPER
R33 R34
10K 10K R35
G

Q8 120

PD5_UC1
S

BSS138

Keterangan:
RANGKAIAN KOMUNIKASI RS485
Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-003
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
RTC DS1307 DAN EEPROM DATA CONCENTRATOR

+5V +5V

+3V3 +5V

R1 R2
R3 R4 4K7 10K
10K 10K
G

GND
Q1 +5V U2
8 1
+5V S0
I2C1_SDA SDA1_H_UC1 7 2
WP S1
SCL1_H_UC1 6 3
SCL S2
D
S

BSS138 SDA1_H_UC1 5 4
SDA GND
IC-AT24C256
+3V3 +5V GND

+5V
R8 R9
10K 10K
G

Q2
8

U3 C1
I2C1_SCL SCL1_H_UC1 SCL1_H_UC1 6 IC-DS1307
SCL
+5V

SDA1_H_UC1 5 1
SDA X1
D
S

BSS138 Y1 18pF

32.768KHz
GND
7 2 C2
GND SOUT X2
+5V
GND

VBAT_RTC_STM 3
VBAT
18pF
C4 C3
4

100nF 100nF

GND J17
I2C1_SCL GND
1
CONECTOR5

I2C1_SDA
2
+3V3
3
+5V
4
GND
5

Keterangan:
RANGKAIAN RTC DAN EEPROM
Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-004
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
PD6_UC1

+5V C24 C25 +5V


R45

R46
+5V 1
1 DCD_1 1 uf 1 uf
6 DSR_1
R47

+5V GND
2 RXD_RS232_1
J9

16
2
6
7 RTS_1 U7

RES1
3 TXD_RS232_1 13 12 D1
DB9

R1IN V- R1OUT
VCC
V+
8 CTS_1 TXD_RS232_1
8 9
R2IN R2OUT
RES1

4 DTR_1 11 14 LED
T1IN T1OUT
9 RI_1 10 7 RXD_RS232_1
T2IN T2OUT
5 GND D2 LED 1 3
GND

C1+ C1-
4 5
C2+ C2-
+5V
IC-MAX232
15

PD5_UC1 R48 1
C26
100nF
J10 GND
RXD_RS232_1
1 GND
TXD_RS232_1 C27 1uF
+
RS232

2
3
C28 1uF
+

GND

Keterangan:
RANGKAIAN KOMUNIKASI RS232
Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-005
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
+3V3 M2

WIZ550S2E
1
3V3
PD2_UC1 2 17
TXD GND
PC12_UC1 3 16
RXD GND
4 15
nRTS nHWTIG
5 14
n_CTS nFACRST
6 13
STATUS2 nSYSRST GND
7 12
STATUS1 RSVD2
8 11
NC RSVD1
9 10
GND 3V3 +3V3

GND MODULE ETHERNET SERIAL

RANGKAIAN KONVERTER SERIAL TO Keterangan:


ETHERNET Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-006
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
D12
+3V3
R68 PD15_UC1
RES1
LED
D13
R69 PD14_UC1
RES1
LED
D14
R70 PD13_UC1
RES1
LED
D15
R71 PD12_UC1
RES1
LED

Keterangan:
RANGKAIAN INDIKATOR LED
Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-007
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
S2
16 1 DIP_SW_D0
15 2 DIP_SW_D1
14 3 DIP_SW_D2
13 4 DIP_SW_D3
12 5 DIP_SW_D4
11 6 DIP_SW_D5
10 7 DIP_SW_D6
9 8 DIP_SW_D7

SW-DIP8
GND

J3
SELECT_ID

SEL_ID
1
2

GND

RANGKAIAN SELECTOR DIP SWITCH ID Keterangan:


MODBUS Data Concentrator
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1 DTC-ARM-008
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
LAMPIRAN D
PROGRAM
Cuplikan Program Konfigurasi ID Modbus melalui DIP Switch
#include "addressable_hw_rtu.h"

uint8_t ReadIDRTU_HW() {
uint8_t _address = 0;
if (!HAL_GPIO_ReadPin(DIP_SW_D0_GPIO_Port, DIP_SW_D0_Pin)) {
_address = _address + 1;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D1_GPIO_Port, DIP_SW_D1_Pin)) {
_address = _address + 2;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D2_GPIO_Port, DIP_SW_D2_Pin)) {
_address = _address + 4;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D3_GPIO_Port, DIP_SW_D3_Pin)) {
_address = _address + 8;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D4_GPIO_Port, DIP_SW_D4_Pin)) {
_address = _address + 16;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D5_GPIO_Port, DIP_SW_D5_Pin)) {
_address = _address + 32;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D6_GPIO_Port, DIP_SW_D6_Pin)) {
_address = _address + 64;
}
if (!HAL_GPIO_ReadPin(DIP_SW_D7_GPIO_Port, DIP_SW_D7_Pin)) {
_address = _address + 128;
}
return _address;
}

Floating point IEEE754 STM32F407


#include "floatingpoint_stm32f407vg_adri.h"
#include "stm32f4xx_hal.h"

//float nilai; // As Double 'berupa bentuk decimal


int sign; // As Integer 'berupa bentuk decimal/biner karena hanya 1 bit saja
(1 atau 0)

uint8_t nExponen; // As Integer 'nilai exponen sebelum ditambah bias (127)


uint8_t nilai_exponen; // As Integer 'masih berupa bentuk desimal sudah
ditambah bias 127,dimana nilai_exponent=nExponen+127

int TempInt; // As Integer 'masih berupa bentuk desimal


float TempFloat; //As Double 'masih berupa bentuk desimal
int bin_float[32]; // As Double 'sudah berupa bentuk biner
int bin_int[24]; // As Integer 'sudah berupa bentuk biner

int bin_exponen[8]; // As Integer 'sudah berupa bentuk biner


int bin_mantissa[24]; // As Integer 'sudah berupa bentuk biner
int hasilFloatingPoint[32]; // As Integer
int hasilfloatingPointByte[4]; // As Integer

int Mantissa;
float HasilMantissa;

//int i;
long int pangkat[20] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048,
4096, 8192, 16384, 32768, 65536 };

void HitungSinglePrecisionFloatingPoint(int NilaiFloat) { //Fungsi untuk


menkonversi bilangan float menjadi 32bit Single Floating Point
// '==============================Pengosongan Variable
bin_mantissa======================
for (int i = 0; i <= 22; i++) {
bin_mantissa[i] = 0;
}
//
'============================================================================
=========
//'==============================Pengosongan Variable Hasil Floating
Point======================
for (int i = 0; i <= 3; i++) {
hasilfloatingPointByte[i] = 0;
}
// ' == == == == == == == == == == == == == == == == == == == == ==
== == == == == == == == == == == == == == == == == == == == == ==

//NilaiFloat = 220.154321465;

if (NilaiFloat < 0) {
sign = 1;
NilaiFloat = NilaiFloat * (-1);
} else {
sign = 0;
}

TempInt = NilaiFloat;
TempFloat = NilaiFloat;
TempFloat = TempFloat - TempInt;

if (TempFloat < 0) {
TempFloat = TempFloat * (-1);
}

// Serial.print(TempInt); Serial.print("\t");
Serial.println(TempFloat);

for (int i = 0; i <= 16; i++) {


bin_int[i] = 0;
}
nilai_exponen = 0;

for (int i = 0; i <= 16; i++) {


if ((TempInt & pangkat[i]) == pangkat[i]) {
bin_int[i] = 1;
} else {
bin_int[i] = 0;
}
}
// 'mencari jumlah exponent
for (int i = 0; i <= 16; i++) {
if (bin_int[16 - i] == 1) {
nExponen = 16 - i;
}
if (bin_int[16 - i] == 1) {
break; //Then Exit For
}
}

//TxtLetakExponen = nExponen;
nilai_exponen = nExponen + 127; // 'nExponen + bias(127)

for (int i = 0; i <= 7; i++) {


if ((nilai_exponen & pangkat[i]) == pangkat[i]) {
bin_exponen[i] = 1;
} else {
bin_exponen[i] = 0;
}
}

for (int i = 0; i <= 31; i++) {


TempFloat = TempFloat * 2;
if (TempFloat < 1) {
TempFloat = TempFloat;
bin_float[i] = 0;
} else {
TempFloat = TempFloat - 1;
bin_float[i] = 1;
}
}

// '======================MENCARI NILAI MANTISSA DARI BILANGAN


BinInt =====================================
for (int i = 0; i <= (nExponen - 1); i++) {
bin_mantissa[i] = bin_int[(nExponen - 1) - i]; //
}

//
'============================================================================
============================

// '======================MENCARI NILAI MANTISSA DARI BILANGAN


BinFloat =====================================
for (int i = 0; i <= (22 - nExponen); i++) {
bin_mantissa[i + nExponen] = bin_float[i];
}
// ' == == == == == == == == == == == == == == == == == == == == ==
== == == == == == == == == == == == == == == == == == == == == == == == == ==
== == == == ==

hasilFloatingPoint[0] = sign;
for (int i = 1; i <= 8; i++) {
hasilFloatingPoint[i] = bin_exponen[8 - i];
}

for (int i = 9; i <= 31; i++) {


hasilFloatingPoint[i] = bin_mantissa[i - 9];
}

//'konversi ke byte1
for (int i = 0; i <= 7; i++) {
if (hasilFloatingPoint[i] == 1) {
hasilfloatingPointByte[0] = hasilfloatingPointByte[0]
+ pangkat[7 - i];
} else {
hasilfloatingPointByte[0] = hasilfloatingPointByte[0];
}
if (hasilFloatingPoint[i + 8] == 1) {
hasilfloatingPointByte[1] = hasilfloatingPointByte[1]
+ pangkat[7 - i];
} else {
hasilfloatingPointByte[1] = hasilfloatingPointByte[1];
}
if (hasilFloatingPoint[i + 16] == 1) {
hasilfloatingPointByte[2] = hasilfloatingPointByte[2]
+ pangkat[7 - i];
} else {
hasilfloatingPointByte[2] = hasilfloatingPointByte[2];
}
if (hasilFloatingPoint[i + 24] == 1) {
hasilfloatingPointByte[3] = hasilfloatingPointByte[0]
+ pangkat[7 - i];
} else {
hasilfloatingPointByte[3] = hasilfloatingPointByte[3];
}
}
}

float floatingPoint(int _Dat1, int _Dat2, int _Dat3, int _Dat4) {


float hasil_floatingPoint = 0;
nExponen = 0;
nilai_exponen = 0;
Mantissa = 0;
HasilMantissa = 0;
//Hitung Exponent
nExponen = ((_Dat1 << 1) | (_Dat2 >> 7));
nilai_exponen = nExponen - 127;
//Hitung Mantissa

Mantissa = _Dat4 | (_Dat3 << 8) | ((_Dat2 & 0b01111111) << 16);

for (int i = 0; i < 23; i++) {


if ((Mantissa & (0x400000 >> i)) == (0x400000 >> i)) {
HasilMantissa = HasilMantissa + HitungPangkatRev(2, (-1)
* (i + 1));
}
}
HasilMantissa = HasilMantissa + 1;

if ((_Dat1 & 0b10000000) == 0b10000000) {


//Bilangan Negatif
hasil_floatingPoint = HitungPangkatRev(2, nilai_exponen)
* HasilMantissa;
hasil_floatingPoint = hasil_floatingPoint * (-1);
} else {
//Bilangan Positif
hasil_floatingPoint = HitungPangkatRev(2, nilai_exponen)
* HasilMantissa;
}

// hasil_floatingPoint = 12.0;
return hasil_floatingPoint;

int HitungPangkat(int a, int b) {


int hasil, i;

hasil = 1;

for (i = 1; i <= b; i++) {


hasil = hasil * a;

return hasil;
}

float HitungPangkatRev(int a, int b) {


float hasil;

hasil = 1;

if (b >= 0) {
for (int i = 1; i <= b; i++) {
hasil = hasil * a;

}
} else {
b = b * (-1);
for (int i = 1; i <= b; i++) {
hasil = hasil * a;

}
hasil = 1.0 / hasil;
}

return hasil;
}

float HitungFloat(float a, float b) {


float hasil;
hasil = 2.0 * 2.5;
return hasil;
}

Listing Program Modbus Master


Perangkat Data Concentrator
#include "stm32f4xx_hal.h"
#include "modbus_master_stm32f407vg_adri.h"

UART_HandleTypeDef huart2;
UART_HandleTypeDef huart4;
UART_HandleTypeDef huart3;
UART_HandleTypeDef huart6;

uint8_t buffTxMB_Master[14];
uint8_t buffRxMB_Master[50];
uint8_t bufferRxMB_Master[2];

uint8_t COM_DataConc_FC03[900];
uint8_t FunctionCode_MBPoll[300]; //Jumlah Poll maksimum adalah 300

uint8_t SlaveID_MBPoll_FC01[300];
uint16_t Str_Add_MBPoll_FC01[300]; //Jumlah Poll maksimum adalah 300
uint16_t Length_MBPoll_FC01[300]; //Jumlah Poll maksimum adalah 300
uint16_t TotalAddressFC01Remap;

uint8_t SlaveID_MBPoll_FC02[300];
uint16_t Str_Add_MBPoll_FC02[300]; //Jumlah Poll maksimum adalah 300
uint16_t Length_MBPoll_FC02[300]; //Jumlah Poll maksimum adalah 300
uint16_t TotalAddressFC02Remap;

uint8_t SlaveID_MBPoll_FC03[300];
uint16_t Str_Add_MBPoll_FC03[300]; //Jumlah Poll maksimum adalah 300
uint16_t Length_MBPoll_FC03[300]; //Jumlah Poll maksimum adalah 300
uint16_t TotalAddressFC03Remap;

uint8_t SlaveID_MBPoll_FC04[300];
uint16_t Str_Add_MBPoll_FC04[300]; //Jumlah Poll maksimum adalah 300
uint16_t Length_MBPoll_FC04[300]; //Jumlah Poll maksimum adalah 300
uint16_t TotalAddressFC03Remap;

uint16_t JumlahPoll_FC01;
uint16_t JumlahPoll_FC02;
uint16_t JumlahPoll_FC03;
uint16_t JumlahPoll_FC04;
uint16_t Add_MBPoll_FC01_Remap[300];
uint16_t Add_MBPoll_FC02_Remap[300];
uint16_t Add_MBPoll_FC03_Remap[300];
uint16_t Add_MBPoll_FC04_Remap[300];

uint16_t DataFC04_Remap[100];
uint16_t DataFC03_Remap[100];

_Bool DataFC02[100];
_Bool DataFC01[100];

uint16_t ValueRegFC03_Remap[300];
uint8_t CounterRx_MBPoll;

uint8_t Length_MBPoll_Response;

void InisialisasiMBPoll_FormatPLC() {
//Pembacaaan Tegangan dari Voltage A-B sampai Voltage L-N Avg
//Pembacaan THD Tegangan

//UNTUK PM800
COM_DataConc_FC03[0] = 2;
SlaveID_MBPoll_FC03[0] = 1;
FunctionCode_MBPoll[0] = 3;
Str_Add_MBPoll_FC03[0] = 1124; //3019
Length_MBPoll_FC03[0] = 4; //2x8 (karena floating point)

COM_DataConc_FC03[1] = 2;
SlaveID_MBPoll_FC03[1] = 1;
FunctionCode_MBPoll[1] = 4;
Str_Add_MBPoll_FC03[1] = 1100; //Current PM800
Length_MBPoll_FC03[1] = 4; //2x8 (karena floating point)

COM_DataConc_FC03[2] = 2;
SlaveID_MBPoll_FC03[2] = 1;
FunctionCode_MBPoll[2] = 4;
Str_Add_MBPoll_FC03[2] = 1180; //Current PM800
Length_MBPoll_FC03[2] = 1; //2x8 (karena floating point)

JumlahPoll_FC03 = 6;

Add_MBPoll_FC03_Remap[0] = 0;
for (int i = 0; i < (JumlahPoll_FC03); ++i) {
Add_MBPoll_FC03_Remap[i + 1] = Add_MBPoll_FC03_Remap[i]
+ Length_MBPoll_FC03[i];
}
TotalAddressFC03Remap = Add_MBPoll_FC03_Remap[JumlahPoll_FC03];

void ReadMBPoll() {

ModbusPoll_FC03_N(4, 1, 0, 50, 50); //Tegangan PM800


ModbusPoll_FC03_N(4, 1, 1, 50, 50); //Arus PM800
ModbusPoll_FC03_N(4, 1, 2, 50, 50); //Arus PM800
}

/*
* _Format
* jika bernilai 0 => maka merupakan Format Protokol
* jika bernilai 1 => maka merupakan Format PLC (Starting Address - 1)
*/

void ModbusPoll_FC03(uint8_t _BaseFormat, uint8_t _SlaveID, uint16_t


_Start_Add,
uint16_t _Length) { //Function Code 03 Read Holding Register

if (_BaseFormat == 0) { //Jika Format Protokol


buffTxMB_Master[0] = _SlaveID; //Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = _Start_Add >> 8; //Starting Address
High
buffTxMB_Master[3] = _Start_Add; //Starting Address Low
buffTxMB_Master[4] = _Length >> 8; //Length High
buffTxMB_Master[5] = _Length; //Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
}
if (_BaseFormat == 1) { //jika Format PLC
buffTxMB_Master[0] = _SlaveID; //Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = (_Start_Add - 1) >> 8; //Starting
Address High
buffTxMB_Master[3] = (_Start_Add - 1); //Starting Address
Low
buffTxMB_Master[4] = (_Length) >> 8; //Length High
buffTxMB_Master[5] = (_Length); //Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
}
Length_MBPoll_Response = 5 + (2 * _Length); //1 Byte Slave ID + 1
Byte Function Code + 1 Byte Length + 2 Byte CRC = 5 Byte

HAL_GPIO_WritePin(DataControl_UART4_GPIO_Port,
DataControl_UART4_Pin, 1);
HAL_UART_Transmit(&huart4, (uint8_t *) buffTxMB_Master, 8,
0xffffffff);
HAL_GPIO_WritePin(DataControl_UART4_GPIO_Port,
DataControl_UART4_Pin, 0);

// HAL_UART_Receive_DMA(&huart4, (uint8_t *) rx, 6);


// HAL_UART_DMAStop(&huart4);

//for (int i = 0; i < Length_MBPoll_Response; i++) {


CounterRx_MBPoll = 0;
while (CounterRx_MBPoll < Length_MBPoll_Response) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_15, 0);
HAL_UART_Receive(&huart4, bufferRxMB_Master, 1, 0xffffffff);
buffRxMB_Master[CounterRx_MBPoll] = bufferRxMB_Master[0];
CounterRx_MBPoll++;
}

void ModbusPoll_FC03_1(uint8_t _BaseFormat, uint8_t _SlaveID,


uint16_t _Start_Add, uint16_t _Length, uint16_t
Response_Timeout,
uint16_t DelayBetwenPoll) { //Function Code 03 Read Holding
Register
HAL_Delay(DelayBetwenPoll);

if (_BaseFormat == 0) { //Jika Format Protokol


buffTxMB_Master[0] = _SlaveID; //Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = _Start_Add >> 8; //Starting Address
High
buffTxMB_Master[3] = _Start_Add; //Starting Address Low
buffTxMB_Master[4] = _Length >> 8; //Length High
buffTxMB_Master[5] = _Length; //Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
}

if (_BaseFormat == 1) { //jika Format PLC


buffTxMB_Master[0] = _SlaveID; //Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = (_Start_Add - 1) >> 8; //Starting
Address High
buffTxMB_Master[3] = (_Start_Add - 1); //Starting Address
Low
buffTxMB_Master[4] = (_Length) >> 8; //Length High
buffTxMB_Master[5] = (_Length); //Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
}
Length_MBPoll_Response = 5 + (2 * _Length); //1 Byte Slave ID + 1
Byte Function Code + 1 Byte Length + 2 Byte CRC = 5 Byte

HAL_GPIO_WritePin(DataControl_UART4_GPIO_Port,
DataControl_UART4_Pin, 1);

HAL_UART_Transmit(&huart4, (uint8_t *) buffTxMB_Master, 8,


0xffffffff);
HAL_GPIO_WritePin(DataControl_UART4_GPIO_Port,
DataControl_UART4_Pin, 0);

HAL_UART_Receive_DMA(&huart4, (uint8_t *) buffRxMB_Master,


Length_MBPoll_Response);

HAL_Delay(Response_Timeout); //tundaan waktu

HAL_UART_DMAStop(&huart4);

//perbedaan ModbusPoll_FC03_1 dengan ModbusPoll_FC03_2 adalah yaitu pada


ModbusPoll_FC03_2 tidak menggunakan delay betwen poll
void ModbusPoll_FC03_2(uint8_t _BaseFormat, uint8_t _SlaveID,
uint16_t _Start_Add, uint16_t _Length, uint16_t
Response_Timeout,
uint16_t DelayBetwenPoll) { //Function Code 03 Read Holding
Register

// HAL_Delay(DelayBetwenPoll);

if (_BaseFormat == 0) { //Jika Format Protokol


buffTxMB_Master[0] = _SlaveID; //Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = _Start_Add >> 8; //Starting Address
High
buffTxMB_Master[3] = _Start_Add; //Starting Address Low
buffTxMB_Master[4] = _Length >> 8; //Length High
buffTxMB_Master[5] = _Length; //Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
} else if (_BaseFormat == 1) { //jika Format PLC
buffTxMB_Master[0] = _SlaveID; //Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = (_Start_Add - 1) >> 8; //Starting
Address High
buffTxMB_Master[3] = (_Start_Add - 1); //Starting Address
Low
buffTxMB_Master[4] = (_Length) >> 8; //Length High
buffTxMB_Master[5] = (_Length); //Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
}
Length_MBPoll_Response = 5 + (2 * _Length); //1 Byte Slave ID + 1
Byte Function Code + 1 Byte Length + 2 Byte CRC = 5 Byte

HAL_GPIO_WritePin(DataControl_UART3_GPIO_Port,
DataControl_UART3_Pin, 1);

HAL_UART_Transmit(&huart3, (uint8_t *) buffTxMB_Master, 8, 0x100);


HAL_GPIO_WritePin(DataControl_UART3_GPIO_Port,
DataControl_UART3_Pin, 0);

HAL_UART_Receive_DMA(&huart3, (uint8_t *) buffRxMB_Master,


Length_MBPoll_Response);

HAL_Delay(Response_Timeout); //tundaan waktu

HAL_UART_DMAStop(&huart4);
//}

void ModbusPoll_FC03_N(uint8_t PortKomunikasi, uint8_t _BaseFormat,


uint8_t _IndexPoll, uint16_t Response_Timeout, uint16_t
DelayBetwenPoll) { //Function Code 03 Read Holding Register

HAL_Delay(DelayBetwenPoll);

if (_BaseFormat == 0) { //Jika Format Protokol


buffTxMB_Master[0] = SlaveID_MBPoll_FC03[_IndexPoll];
//Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = Str_Add_MBPoll_FC03[_IndexPoll] >> 8;
//Starting Address High
buffTxMB_Master[3] = Str_Add_MBPoll_FC03[_IndexPoll];
//Starting Address Low
buffTxMB_Master[4] = Length_MBPoll_FC03[_IndexPoll] >> 8;
//Length High
buffTxMB_Master[5] = Length_MBPoll_FC03[_IndexPoll];
//Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
} else if (_BaseFormat == 1) { //jika Format PLC
buffTxMB_Master[0] = SlaveID_MBPoll_FC03[_IndexPoll];
//Slave Id
buffTxMB_Master[1] = 3; //FunctionCode
buffTxMB_Master[2] = Str_Add_MBPoll_FC03[_IndexPoll] >> 8;
//Starting Address High
buffTxMB_Master[3] = (Str_Add_MBPoll_FC03[_IndexPoll] - 1);
//Starting Address Low
buffTxMB_Master[4] = (Length_MBPoll_FC03[_IndexPoll]) >> 8;
//Length High
buffTxMB_Master[5] = (Length_MBPoll_FC03[_IndexPoll]);
//Length Low
buffTxMB_Master[6] = HitungCRC1(buffTxMB_Master, 6); //CRC
HI
buffTxMB_Master[7] = HitungCRC1(buffTxMB_Master, 6) >> 8;
//CRC LOW
}
Length_MBPoll_Response = 5 + (2 * Length_MBPoll_FC03[_IndexPoll]);
//1 Byte Slave ID + 1 Byte Function Code + 1 Byte Length + 2 Byte CRC =
5 Byte

if (PortKomunikasi == 3) { //UART 4
HAL_GPIO_WritePin(DataControl_UART4_GPIO_Port,
DataControl_UART4_Pin,
1);
HAL_UART_Transmit(&huart4, (uint8_t *) buffTxMB_Master, 8,
0xffffffff);
HAL_GPIO_WritePin(DataControl_UART4_GPIO_Port,
DataControl_UART4_Pin,
0);
HAL_UART_Receive_DMA(&huart4, (uint8_t *) buffRxMB_Master,
Length_MBPoll_Response);
HAL_Delay(Response_Timeout); //tundaan waktu
HAL_UART_DMAStop(&huart4);

} else if (PortKomunikasi == 4) { //UART 3


HAL_GPIO_WritePin(DataControl_UART3_GPIO_Port,
DataControl_UART3_Pin,
1);
HAL_UART_Transmit(&huart3, (uint8_t *) buffTxMB_Master, 8,
0xffffffff);
HAL_GPIO_WritePin(DataControl_UART3_GPIO_Port,
DataControl_UART3_Pin,
0);
HAL_UART_Receive_DMA(&huart3, (uint8_t *) buffRxMB_Master,
Length_MBPoll_Response);
HAL_Delay(Response_Timeout); //tundaan waktu
HAL_UART_DMAStop(&huart3);

// DataFC03_Remap[11]=100;
} else if (PortKomunikasi == 5) { //UART 6
HAL_GPIO_WritePin(DataControl_UART6_GPIO_Port,
DataControl_UART6_Pin,
1);
HAL_UART_Transmit(&huart6, (uint8_t *) buffTxMB_Master, 8,
0xffffffff);
HAL_GPIO_WritePin(DataControl_UART6_GPIO_Port,
DataControl_UART6_Pin,
0);
HAL_UART_Receive_DMA(&huart6, (uint8_t *) buffRxMB_Master,
Length_MBPoll_Response);
HAL_Delay(Response_Timeout); //tundaan waktu
HAL_UART_DMAStop(&huart6);
}

for (int i = 0; i < Length_MBPoll_FC03[_IndexPoll]; i++) {


DataFC03_Remap[Add_MBPoll_FC03_Remap[_IndexPoll] + i] =
buffRxMB_Master[3 + (i * 2)] << 8; //3 berasal
dari 1 Byte Slave Id, 1 Byte Function Code, 1 Byte Length
DataFC03_Remap[Add_MBPoll_FC03_Remap[_IndexPoll] + i] =

DataFC03_Remap[Add_MBPoll_FC03_Remap[_IndexPoll] + i]
+ buffRxMB_Master[4 + (i * 2)];
}

RTC DS1307
#include "stm32f4xx_hal.h"
#include "rtc_ds1307_stm32f407_adri.h"

I2C_HandleTypeDef hi2c1;
unsigned char DataBufferSetRTCDS1307[5];
uint8_t DataHasilPembacaanRTCDS1307[8];

uint8_t VarJamDS1307, VarMenitDS1307, VarDetikDS1307;


uint8_t VarHariDS1307, VarBulanDS1307, VarTangalDS1307, VarTahunDS1307;

uint8_t KonversiBCD2DEC(uint8_t DataInputKonversi) {


uint8_t Hasil;
Hasil = ((DataInputKonversi >> 4) * 10) + (DataInputKonversi &
0x0f);
return Hasil;

uint8_t KonversiDEC2BCD(uint8_t DataInputKonversi) {


uint8_t Hasil;
Hasil = ((DataInputKonversi / 10) << 4) | (DataInputKonversi %
10);
return Hasil;
}

void SettSQWOFrek_DS1307(uint8_t FrekSQWO) {


DataBufferSetRTCDS1307[0] = 0x00 | FrekSQWO;
HAL_I2C_Mem_Write(&hi2c1, 0xD0, 7, I2C_MEMADD_SIZE_8BIT,
DataBufferSetRTCDS1307, 1, 200);
}

void BacaDataRTC(void) {

HAL_I2C_Mem_Read(&hi2c1, 0xD0, 0, I2C_MEMADD_SIZE_8BIT,


DataHasilPembacaanRTCDS1307, 8, 200);
VarDetikDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[0]);
VarMenitDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[1]);
VarJamDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[2]);

VarHariDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[3]);
VarTangalDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[4]);
VarBulanDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[5]);
VarTahunDS1307 = KonversiBCD2DEC(DataHasilPembacaanRTCDS1307[6]);
}

void SettJamRTC_DS1307(uint8_t VSetJam, uint8_t VSetMenit, uint8_t


VSetDetik) {

DataBufferSetRTCDS1307[0] = KonversiDEC2BCD(VSetDetik);
DataBufferSetRTCDS1307[1] = KonversiDEC2BCD(VSetMenit);
DataBufferSetRTCDS1307[2] = KonversiDEC2BCD(VSetJam);

HAL_I2C_Mem_Write(&hi2c1, 0xD0, 0, I2C_MEMADD_SIZE_8BIT,


DataBufferSetRTCDS1307, 3, 200);

void SettTanggalRTC_DS1307(uint8_t VSetTanggal, uint8_t VSetBulan,


uint8_t VSetTahun) {

DataBufferSetRTCDS1307[0] = KonversiDEC2BCD(VSetTanggal);
DataBufferSetRTCDS1307[1] = KonversiDEC2BCD(VSetBulan);
DataBufferSetRTCDS1307[2] = KonversiDEC2BCD(VSetTahun);

HAL_I2C_Mem_Write(&hi2c1, 0xD0, 4, I2C_MEMADD_SIZE_8BIT,


DataBufferSetRTCDS1307, 3, 200);
}

void SettHariRTC_DS1307(uint8_t VSetHari) {

DataBufferSetRTCDS1307[0] = KonversiDEC2BCD(VSetHari);

HAL_I2C_Mem_Write(&hi2c1, 0xD0, 3, I2C_MEMADD_SIZE_8BIT,


DataBufferSetRTCDS1307, 1, 200);
}

EEPROM AT24C256
#include "stm32f4xx_hal.h"
#include "eeprom_at24c256_stm32f407vg.h"

I2C_HandleTypeDef hi2c1;

uint8_t dataReceiveEEPROMI2C_256[2];

int ReadEEPROM_AT24C256(unsigned int AlamatPerangkatEEPROM,


unsigned int AlamatMemory) {
unsigned char BuffRequest[3];
uint8_t Hasil;
BuffRequest[0] = AlamatMemory >> 8;
BuffRequest[1] = AlamatMemory & 0xff;
HAL_I2C_Master_Transmit(&hi2c1, 0xa0, BuffRequest, 2, 100);
HAL_I2C_Master_Receive(&hi2c1, 0xa0, &BuffRequest[2], 1, 100);
Hasil = BuffRequest[2];
// HAL_Delay(500);
return Hasil;
}

void TulisKeEEPROM_AT24C256(unsigned int AlamatMemory, uint8_t dataKirim) {


HAL_I2C_Mem_Write(&hi2c1, 0xA0, AlamatMemory, 2, dataKirim, 1, 0xfffff);

int BacaDariEEPROM_AT24C256(unsigned int AlamatMemory) {

uint8_t Hasil;
HAL_I2C_Mem_Write(&hi2c1, 0xA0, AlamatMemory, 2, Hasil, 0, 0xfffff);
HAL_I2C_Mem_Read(&hi2c1, 0xA1, AlamatMemory, 2, Hasil, 1, 0xfffff);
return Hasil;
}

void WriteToEEPROM_AT24C256(unsigned int AlamatPerangkatEEPROM,


unsigned int AlamatMemory, uint8_t dataKirim) {
uint8_t buffKirim[3];
buffKirim[0] = AlamatMemory >> 8;
buffKirim[1] = AlamatMemory & 0xff;
buffKirim[2] = dataKirim;
HAL_I2C_Master_Transmit(&hi2c1, AlamatPerangkatEEPROM, buffKirim, 3, 100);
}

void WriteToEEPROM_AT24C256_2(unsigned int AlamatPerangkatEEPROM,


unsigned int AlamatMemory, uint8_t dataKirim1, uint8_t dataKirim2)
{
unsigned char buffKirim[4];
buffKirim[0] = AlamatMemory >> 8;
buffKirim[1] = AlamatMemory & 0xff;
buffKirim[2] = dataKirim1;
buffKirim[3] = dataKirim2;
HAL_I2C_Master_Transmit(&hi2c1, AlamatPerangkatEEPROM, buffKirim, 4,
0xFFFFFFFF);
}

int ReadEEPROM_AT24C256_2(unsigned int AlamatPerangkatEEPROM,


unsigned int AlamatMemory) {
uint8_t BuffRequest[4];
uint8_t Hasil;
BuffRequest[0] = AlamatMemory >> 8;
BuffRequest[1] = AlamatMemory & 0xff;
HAL_I2C_Master_Transmit(&hi2c1, 0xa0, BuffRequest, 2, 0xFFFFFFFF);
HAL_I2C_Master_Receive(&hi2c1, 0xa0, &BuffRequest[2], 2, 0xFFFFFFFF);
Hasil = BuffRequest[2] >> 8;
Hasil = Hasil + BuffRequest[3];
// HAL_Delay(500);
return Hasil;
}

EEPROM AT24C8
#include "stm32f4xx_hal.h"
#include "eeprom_at24c8_stm32f407vg.h"

I2C_HandleTypeDef hi2c1;

uint8_t dataReceiveEEPROMI2C;

int ReadEEPROM_AT24C08(unsigned int AlamatPerangkatEEPROM, unsigned int


AlamatMemory) {
unsigned char BuffRequest[3];
uint8_t Hasil;
BuffRequest[0] = AlamatMemory;
// BuffRequest[1] = AlamatMemory & 0xff;
HAL_I2C_Master_Transmit(&hi2c1, 0xa0, BuffRequest, 1, 0xffffffff);
HAL_I2C_Master_Receive(&hi2c1, 0xa0, &BuffRequest[2], 1, 0xffffffff);
Hasil = BuffRequest[2];
// HAL_Delay(500);
return Hasil;
}
void WriteToEEPROM_AT24C08(unsigned int AlamatPerangkatEEPROM,
unsigned int AlamatMemory, uint8_t dataKirim) {
unsigned char buffKirim[3];
buffKirim[0] = AlamatMemory;
// buffKirim[1] = AlamatMemory & 0xff;
buffKirim[1] = dataKirim;
HAL_I2C_Master_Transmit(&hi2c1, AlamatPerangkatEEPROM, buffKirim, 2,
0xffffffff);
}
Library akses flash memory
#include "stm32f4xx_hal.h"
#include "flash_stm32f407vg.h"

void SimpanKeFlash(uint32_t Flash_Address, uint32_t Flash_Data) {


HAL_FLASH_Unlock();
FLASH_Erase_Sector(FLASH_SECTOR_11, VOLTAGE_RANGE_3);
HAL_FLASH_Program(FLASH_TYPEPROGRAM_WORD, Flash_Address,
Flash_Data);

HAL_FLASH_Lock();
}

uint32_t BacaDariFlash(uint32_t Flash_Address) {


uint32_t Flash_Data;
Flash_Data = *(uint32_t*) Flash_Address;
return Flash_Data;
}

Akses USB-MB STM32F407


#include "main.h"
#include "stm32f4xx_hal.h"
#include "config_modbus_rtu.h"

long CRC_HI_USB = 0;
long CRC_LOW_USB = 0;
long TempCRC_USB;
long CRC_MODBUS_USB_16BIT[50];
int DataModbusUSB[32];

void HitungCRC_USB(int nCRC) { //banyaknya Data


nCRC = nCRC - 1;
CRC_HI_USB = 0;
CRC_LOW_USB = 0;
CRC_MODBUS_USB_16BIT[0] = 65535; //FF

CRC_MODBUS_USB_16BIT[0] = CRC_MODBUS_USB_16BIT[0] ^
DataModbusUSB[0];

for (int i = 0; i <= 7; i++) {


TempCRC_USB = CRC_MODBUS_USB_16BIT[0] & 1;
// CRC = CRC >> 1;

if (TempCRC_USB == 1) {
CRC_MODBUS_USB_16BIT[0] = CRC_MODBUS_USB_16BIT[0] >>
1;
CRC_MODBUS_USB_16BIT[0] = CRC_MODBUS_USB_16BIT[0] ^
40961; //40961 Const Polynomial
} else {
CRC_MODBUS_USB_16BIT[0] = CRC_MODBUS_USB_16BIT[0] >>
1;
}
}

// Serial.println(CRC[0]);
//CRC Ke 2 sampai CRC ke 5
for (int j = 1; j <= nCRC; j++) {
CRC_MODBUS_USB_16BIT[j] = CRC_MODBUS_USB_16BIT[j - 1]
^ DataModbusUSB[j];
for (int i = 0; i <= 7; i++) {
TempCRC_USB = CRC_MODBUS_USB_16BIT[j] & 1;
// CRC = CRC >> 1;

if (TempCRC_USB == 1) {
CRC_MODBUS_USB_16BIT[j] =
CRC_MODBUS_USB_16BIT[j] >> 1;
CRC_MODBUS_USB_16BIT[j] =
CRC_MODBUS_USB_16BIT[j]
^ 40961; //40961 Const Polynomial
} else {
CRC_MODBUS_USB_16BIT[j] =
CRC_MODBUS_USB_16BIT[j] >> 1;
}
}
}
CRC_HI_USB = CRC_MODBUS_USB_16BIT[nCRC] >> 8;

// Serial.println(CRC_LOW_USB );
if ((CRC_MODBUS_USB_16BIT[nCRC] & 1) == 1) {
CRC_LOW_USB = CRC_LOW_USB + 1;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 2) == 2) {
CRC_LOW_USB = CRC_LOW_USB + 2;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 4) == 4) {
CRC_LOW_USB = CRC_LOW_USB + 4;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 8) == 8) {
CRC_LOW_USB = CRC_LOW_USB + 8;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 16) == 16) {
CRC_LOW_USB = CRC_LOW_USB + 16;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 32) == 32) {
CRC_LOW_USB = CRC_LOW_USB + 32;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 64) == 64) {
CRC_LOW_USB = CRC_LOW_USB + 64;
}
if ((CRC_MODBUS_USB_16BIT[nCRC] & 128) == 128) {
CRC_LOW_USB = CRC_LOW_USB + 128;
}

Modbus Slave Receive Data Concentrator


void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,
DataControl_UART2_Pin, 0);
HAL_UART_Receive(&huart2, bufferRx, 1, 0xffffffff);
BufferModbusRx[counterRX] = bufferRx[0]; //Copy data BufferRx ke
dalam dataRx
DataModbus[counterRX] = BufferModbusRx[counterRX];
HitungCRC2(counterRX + 1); //menghitung CRC
counterRX++;
if (counterRX == 1) { //counterRx=2 dan CounterRx=3 Merupakan
address request modbus
if (ID_RTU_SEL == 0) { //Jika Pin ID_RTU_SEL Dijumper ke
Ground
ID_Modbus_Fix = ID_RTU_HW;
if (ID_RTU_HW <= 0) {
ID_Modbus_Fix = 1; //Default
}
}
if (BufferModbusRx[0] != ID_Modbus_Fix) {
counterRX = 0;
}

} else if (counterRX == 2) {
if (BufferModbusRx[1] != 1 & BufferModbusRx[1] != 2
& BufferModbusRx[1] != 3 & BufferModbusRx[1]
!= 4) {
counterRX = 0;

}
} else if (counterRX == 4) { //counterRx=2 dan CounterRx=3
Merupakan address request modbus
AddressModbusRequest = (BufferModbusRx[2] << 8) +
BufferModbusRx[3];
} else if (counterRX == 6) { //counterRx=4 dan counterRx=5
Merupakan length Request modbus
LengthModbusRequest = (BufferModbusRx[4] << 8) +
BufferModbusRx[5];
//jika (AddressModbusRequest >= AddressDefault_DO1_MbRTU &
AddressModbusRequest <= AddressDefault_DO16_MbRTU)
if ((BufferModbusRx[1] == ModbusFC01)
| (BufferModbusRx[1] == ModbusFC02)) { //Read
Coil Dan Read Discrete Input

if ((LengthModbusRequest % 8) == 0) {
if ((LengthModbusRequest / 8) == 0) {
LengthDataResponseMB = 1;
} else {
LengthDataResponseMB =
(LengthModbusRequest / 8);
}
} else if ((LengthModbusRequest % 8) > 0) {
LengthDataResponseMB = (LengthModbusRequest /
8) + 1;
}

if (BufferModbusRx[1] == ModbusFC01) { //jika data


receive byte 1 sama dengan FunctionCode 01 ?

//periksa apakah alamat address tersedia pada


rtu ??

//Read Coil

HasilBacaStatusCoil = 0b10110101;

} else if (BufferModbusRx[1] == ModbusFC02) {


//perikasa apakah alamat address tersedia pada
rtu ??

//Read Discreate

HasilBacaInputDiscrete = 0b10110111;

}
} else if ((BufferModbusRx[1] == ModbusFC03)
| (BufferModbusRx[1] == ModbusFC04)) { //Read
LengthDataResponseMB = LengthModbusRequest * 2;

} else if (BufferModbusRx[1] == ModbusFC05) { //Write Single


Coil
//Masuk ke fungi baca Write Single Coil
AddressModbusRequest = (BufferModbusRx[2] << 8) +
BufferModbusRx[3];
} else if (BufferModbusRx[1] == 6) { //Write Single Register
//masuk ke fungsi baca Single Register
AddressModbusRequest = (BufferModbusRx[2] << 8) +
BufferModbusRx[3];
} else if (BufferModbusRx[1] == ModbusFC015) { //Write
Multiple Coil

} else if (BufferModbusRx[1] == ModbusFC016) { //Write


Multiple Coil

} else if (counterRX >= 8) { //jika data sudah mencapai 8 data


if ((CRC_HI == 0) & (CRC_LOW == 0)) {

if (BufferModbusRx[0] == ID_Modbus_Fix) {

if (BufferModbusRx[1] == ModbusFC01) {
if ((AddressModbusRequest +
LengthModbusRequest)
- 1<=
AddressDefault_DO16_MbRTU
-
AddressDefault_DO1_MbRTU) {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 1;
bufferTx[2] =
LengthDataResponseMB;
for (int i = 0; i <
LengthDataResponseMB; i++) {
bufferTx[3 + i] =
HasilBacaStatusCoil >> (8 * i);
}
bufferTx[3 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB);
bufferTx[4 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx,
5 +
LengthDataResponseMB, 0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,
DataControl_UART2_Pin, 0);
} else {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 0x81;
bufferTx[2] = 2;
bufferTx[3] =
HitungCRC1(bufferTx, 3);
bufferTx[4] =
HitungCRC1(bufferTx, 3) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx, 5,
0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
}
} else if (BufferModbusRx[1] == ModbusFC02) {
if ((AddressModbusRequest +
LengthModbusRequest)
- 1<=
AddressDefault_DI16_MbRTU
-
AddressDefault_DI1_MbRTU) {

bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 2;
bufferTx[2] =
LengthDataResponseMB;
for (int i = 0; i <
LengthDataResponseMB; i++) {
bufferTx[3 + i] =
HasilBacaInputDiscrete >> (8 * i);
}
bufferTx[3 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB);
bufferTx[4 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx,
5 +
LengthDataResponseMB, 0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
} else {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 0x81;
bufferTx[2] = 2;
bufferTx[3] =
HitungCRC1(bufferTx, 3);
bufferTx[4] =
HitungCRC1(bufferTx, 3) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx, 5,
0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
}
} else if (BufferModbusRx[1] == ModbusFC03) {
if ((AddressModbusRequest +
LengthModbusRequest)
- 1<=
AddressDefault_AI16_MbRTU
-
AddressDefault_AI1_MbRTU) {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 3;
bufferTx[2] =
LengthDataResponseMB;
for (int i = 0; i <
LengthModbusRequest; i++) {
bufferTx[3 + (i * 2)] =
DataFC03_Remap[i
+
(AddressModbusRequest

- AddressDefault_AI1_MbRTU)] >> 8;
bufferTx[4 + (i * 2)] =
DataFC03_Remap[i
+
(AddressModbusRequest

- AddressDefault_AI1_MbRTU)];
}
bufferTx[3 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB);
bufferTx[4 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx,
5 +
LengthDataResponseMB, 0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
} else {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 0x81;
bufferTx[2] = 2;
bufferTx[3] =
HitungCRC1(bufferTx, 3);
bufferTx[4] =
HitungCRC1(bufferTx, 3) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx, 5,
0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
//
counterRX = 0;
}
} else if (BufferModbusRx[1] == ModbusFC04) {
if ((AddressModbusRequest +
LengthModbusRequest)
- 1<=
AddressDefault_AO16_MbRTU
-
AddressDefault_AO1_MbRTU) {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 4;
bufferTx[2] =
LengthDataResponseMB;
for (int i = 0; i <
LengthModbusRequest; i++) {
bufferTx[3 + (i * 2)] =
ValAnalogOutput[i
+
(AddressModbusRequest

- AddressDefault_AO1_MbRTU)] >> 8;
bufferTx[4 + (i * 2)] =
ValAnalogOutput[i
+
(AddressModbusRequest

- AddressDefault_AO1_MbRTU)];
}
bufferTx[3 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB);
bufferTx[4 +
LengthDataResponseMB] = HitungCRC1(
bufferTx, 3 +
LengthDataResponseMB) >> 8;
HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx,
5 +
LengthDataResponseMB, 0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
} else {
bufferTx[0] = ID_Modbus_Fix;
bufferTx[1] = 0x81;
bufferTx[2] = 3;
bufferTx[3] =
HitungCRC1(bufferTx, 3);
bufferTx[4] =
HitungCRC1(bufferTx, 3) >> 8;

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx, 5,
0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
//
counterRX = 0;
}
} else if (BufferModbusRx[1] == ModbusFC05) {
//Write Single Coil
if (AddressModbusRequest
<=
AddressDefault_DO16_MbRTU
-
AddressDefault_DO1_MbRTU) {

//
HAL_GPIO_TogglePin(DigitalOutput1_GPIO_Port,
//
DigitalOutput1_Pin);

if (BufferModbusRx[4] == 255
&& BufferModbusRx[5]
== 0) {

} else if (BufferModbusRx[4] == 0
&& BufferModbusRx[5]
== 0) {
//
HAL_GPIO_WritePin(DigitalOutput1_GPIO_Port,
//
DigitalOutput1_Pin, 1);
//
WriteSingleCoil(AddressModbusRequest + 1, 1);
}
for (int i = 0; i <= 7; i++) {
bufferTx[i] =
BufferModbusRx[i];
}

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx, 8,
0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
//
counterRX = 0;

}
} else if (BufferModbusRx[1] == 6) { //Write
Single Register
if (AddressModbusRequest
<=
AddressDefault_AO16_MbRTU
-
AddressDefault_AO1_MbRTU) {

ValAnalogOutput[AddressModbusRequest] =
(BufferModbusRx[4]
<< 8) + BufferModbusRx[5];

WriteSingleRegister(AddressModbusRequest,

ValAnalogOutput[AddressModbusRequest]);

for (int i = 0; i <= 7; i++) {


bufferTx[i] =
BufferModbusRx[i];
}

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 1);
HAL_UART_Transmit(&huart2,
(uint8_t *) bufferTx, 8,
0xffffffff);

HAL_GPIO_WritePin(DataControl_UART2_GPIO_Port,

DataControl_UART2_Pin, 0);
//
counterRX = 0;

}
}

}
} else {
counterRX = 0;
// HAL_Delay(10);
}

counterRX = 0;
}
// counterRX++;
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */

/* USER CODE END USART2_IRQn 1 */


}
program penyimpanan ke csv
Imports Microsoft.VisualBasic.FileIO
Module Simpan2CSV

Sub CreateCSVfile(ByVal _strCustomerCSVPath As String, ByVal


_FunctionCode As String, ByVal _SlaveID As String, ByVal _StartingAddress
As String, ByVal _LengthModbus As String, ByVal _Email As String, ByVal
_Msg As String)
'MASUKAN DATA KE ARRAY

'Hapus DATA

Try
Dim stLine As String = ""
Dim objWriter As IO.StreamWriter =
IO.File.AppendText(_strCustomerCSVPath)

If IO.File.Exists(_strCustomerCSVPath) Then

'IO.File.

objWriter.Write(_FunctionCode & ",")


objWriter.Write(_SlaveID & ",")
objWriter.Write(_StartingAddress & ",")
objWriter.Write(_LengthModbus)

objWriter.Write(Environment.NewLine)
End If
objWriter.Close()
'ClearTextbox()
Catch ex As Exception

End Try
End Sub

Sub SimpanDataCSV(ByVal _strCustomerCSVPath As String, ByVal _DataCSV


As String)
'MASUKAN DATA KE ARRAY

'Hapus DATA

Try
Dim stLine As String = ""
Dim objWriter As IO.StreamWriter =
IO.File.AppendText(_strCustomerCSVPath)
If IO.File.Exists(_strCustomerCSVPath) Then

objWriter.Write(_DataCSV)

objWriter.Write(Environment.NewLine)
End If
objWriter.Close()
'ClearTextbox()
Catch ex As Exception

End Try
End Sub

Sub main()
FileOpen(1, "D:\PROJECT VB NET\GeneratorSourceModbus - Rev1\Data
Config\adri.txt", OpenMode.Output)
PrintLine(1, "Hello adri")
Dim input As String = ""

FileClose()

End Sub

End Module

Modbus RTU Visual Studio


Public Class ClassModbusRTU
Public SlaveIdPoll_FC5() As Integer 'Register untuk mendaftarkan Slave
ID, KHUSUS FUNCTION CODE 05
Public AddressPoll_FC5() As Integer

'UNTUK FUNCTION CODE 01, 02, 03, 04


Public AddressPoll_FC() As Integer
Public SlaveIdPoll_FC() As Integer
Public FunctionCodePoll_FC() As Integer
Public LengthPoll_FC() As Integer

Public CoilStatusFC5_Rev2(255, 50000) As Boolean 'untuk FC01


Public RegisterStatusFC6_Rev2(255, 50000) As Boolean 'untuk FC06

Public DataFunctionCode01_Rev2(255, 30000) As Boolean 'karena maksimum


address 65535 dan length 4095 sehingga total 65535+4095=
Public DataFunctionCode02_Rev2(255, 30000) As Boolean
Public DataFunctionCode03_Rev2(255, 30000) As Integer
Public DataFunctionCode04_Rev2(255, 30000) As Integer

'tambahan 17 JULI 2018


Public AddressPoll_FCREV As Integer
Public SlaveIdPoll_FCREV As Integer
Public FunctionCodePoll_FCREV As Integer
Public LengthPoll_FCREV As Integer
'Sampai Sini Tambahan tangggal 17 Juli 2018

Public Function HitungFloatingPoint(ByVal NilaiByte4_Float As Byte,


ByVal NilaiByte3_Float As Byte, ByVal NilaiByte2_Float As Byte, ByVal
NilaiByte1_Float As Byte) As Single
Dim BitFloatingPoint(32) As Boolean
Dim sign_FloatingPoint As Boolean = False
Dim mantissa_FloatingPoint As Single = 0
Dim exponent_FloatingPoint As Integer = 0

For i As Integer = 0 To 7
If (NilaiByte1_Float And 2 ^ i) = 2 ^ i Then
BitFloatingPoint(i) = True
Else
BitFloatingPoint(i) = False
End If

If (NilaiByte2_Float And 2 ^ i) = 2 ^ i Then


BitFloatingPoint(i + 8) = True
Else
BitFloatingPoint(i + 8) = False
End If

If (NilaiByte3_Float And 2 ^ i) = 2 ^ i Then


BitFloatingPoint(i + 16) = True
Else
BitFloatingPoint(i + 16) = False
End If

If (NilaiByte4_Float And 2 ^ i) = 2 ^ i Then


BitFloatingPoint(i + 24) = True
Else
BitFloatingPoint(i + 24) = False
End If
Next

sign_FloatingPoint = BitFloatingPoint(31)

For i As Integer = 23 To 30
If BitFloatingPoint(i) = True Then
exponent_FloatingPoint = exponent_FloatingPoint + (2 ^ (i -
23))
Else
exponent_FloatingPoint = exponent_FloatingPoint
End If

Next
exponent_FloatingPoint = exponent_FloatingPoint - 127

For i As Integer = 0 To 22
If BitFloatingPoint(i) = True Then
mantissa_FloatingPoint = mantissa_FloatingPoint + (2 ^ -(23
- i))
End If
Next
mantissa_FloatingPoint = mantissa_FloatingPoint + 1
HitungFloatingPoint = mantissa_FloatingPoint * (2 ^
exponent_FloatingPoint)

If sign_FloatingPoint = 0 Then
HitungFloatingPoint = HitungFloatingPoint
Else
HitungFloatingPoint = HitungFloatingPoint * -1
End If

Return HitungFloatingPoint
End Function

Public Function HitungFloatingPoint2(ByVal NilaiByte2BytePertama As


Integer, ByVal NilaiByte2ByteKedua As Integer) As Single
HitungFloatingPoint2 = HitungFloatingPoint((NilaiByte2BytePertama
>> 8) And &HFF, NilaiByte2BytePertama And &HFF, (NilaiByte2ByteKedua >> 8)
And &HFF, NilaiByte2ByteKedua And &HFF)

Return HitungFloatingPoint2
End Function

'untuk merequest functionCode 01, 02, 03, 04


Public Function RequestFC_Dec(ByVal SlaveId As Byte, ByVal FunctionCode
As Byte, ByVal StartAddress As Integer, ByVal LengthFC As Byte) As Byte()
Dim StartAddressHi, StartAddressLow As Integer
Dim LengthFC_Hi, lengthFC_Low As Integer
Dim CRC_Hi, CRC_Low As Integer

Dim DataTransmit() As Byte

StartAddressHi = StartAddress And &HFF00


StartAddressHi = StartAddressHi >> 8
StartAddressLow = StartAddress And &HFF

LengthFC_Hi = LengthFC And &HFF00


LengthFC_Hi = LengthFC_Hi >> 8
lengthFC_Low = LengthFC And &HFF

CRC_Hi = CRC(6, SlaveId, FunctionCode, StartAddressHi,


StartAddressLow, LengthFC_Hi, lengthFC_Low)
CRC_Hi = CRC_Hi And &HFF00
CRC_Hi = CRC_Hi >> 8

CRC_Low = CRC(6, SlaveId, FunctionCode, StartAddressHi,


StartAddressLow, LengthFC_Hi, lengthFC_Low)
CRC_Low = CRC_Low And &HFF

DataTransmit = New Byte() {(SlaveId), (FunctionCode),


(StartAddressHi), (StartAddressLow), (LengthFC_Hi), (lengthFC_Low),
(CRC_Low), (CRC_Hi)}

Return DataTransmit
End Function

Public Function RequestFC5_Dec(ByVal SlaveId As Byte, ByVal AddressFC5


As Integer, ByVal ValueCoil As Boolean) As Byte()
Dim AddressHi, AddressLow As Integer
Dim ValueCoil_Hi, ValueCoil_Low As Byte
Dim CRC_Hi, CRC_Low As Integer

Dim DataTransmit() As Byte

AddressHi = AddressFC5 And &HFF00


AddressHi = AddressHi >> 8
AddressLow = AddressFC5 And &HFF

If ValueCoil = True Then


ValueCoil_Hi = 255
ValueCoil_Low = 0
Else
ValueCoil_Hi = 0
ValueCoil_Low = 0
End If

CRC_Hi = CRC(6, SlaveId, 5, AddressHi, AddressLow, ValueCoil_Hi,


ValueCoil_Low)
CRC_Hi = CRC_Hi And &HFF00
CRC_Hi = CRC_Hi >> 8

CRC_Low = CRC(6, SlaveId, 5, AddressHi, AddressLow, ValueCoil_Hi,


ValueCoil_Low)
CRC_Low = CRC_Low And &HFF

DataTransmit = New Byte() {(SlaveId), (5), (AddressHi),


(AddressLow), (ValueCoil_Hi), (ValueCoil_Low), (CRC_Low), (CRC_Hi)}

'RequestFC5_Dec = SlaveId & " " & 5 & " " & AddressHi & " " &
AddressLow & " " & " " & ValueCoil_Hi & " " & ValueCoil_Low & " " & CRC_Hi
& " " & CRC_Low

'RequestFC5_Dec = Chr(SlaveId) & Chr(5) & Chr(AddressHi) &


Chr(AddressLow) & Chr(255) & Chr(ValueCoil_Low) & Chr(CRC_Hi) &
Chr(CRC_Low)
Return DataTransmit
End Function

Public Function RequestFC6_Dec(ByVal _SlaveId As Byte, ByVal


_AddressFC6 As Integer, ByVal _ValueRegister As Integer) As Byte()
Dim AddressHi, AddressLow As Integer
Dim ValueRegister_Hi, ValueRegister_Low As Byte
Dim CRC_Hi, CRC_Low As Integer

Dim DataTransmit() As Byte

AddressHi = _AddressFC6 And &HFF00


AddressHi = AddressHi >> 8
AddressLow = _AddressFC6 And &HFF
ValueRegister_Hi = (_ValueRegister << 8) And &HFF
ValueRegister_Low = _ValueRegister And &HFF

CRC_Hi = CRC(6, _SlaveId, 6, AddressHi, AddressLow,


ValueRegister_Hi, ValueRegister_Low)
CRC_Hi = CRC_Hi And &HFF00
CRC_Hi = CRC_Hi >> 8

CRC_Low = CRC(6, _SlaveId, 6, AddressHi, AddressLow,


ValueRegister_Hi, ValueRegister_Low)
CRC_Low = CRC_Low And &HFF

DataTransmit = New Byte() {(_SlaveId), (6), (AddressHi),


(AddressLow), (ValueRegister_Hi), (ValueRegister_Low), (CRC_Low), (CRC_Hi)}

Return DataTransmit
End Function

Public Function RequestFC16_Dec(ByVal _SlaveId As Byte, ByVal


_AddressFC16 As Integer, ByVal _Length As Integer, ParamArray _DataFC16()
As Integer) As Byte()
Dim AddressHi, AddressLow As Integer
Dim LengthHi, LengthLow As Integer
Dim Quantity As Integer
Dim CRC_Hi, CRC_Low As Integer
Dim DataTransmit() As Byte

Dim CRC_Tampung As Integer

AddressHi = _AddressFC16 And &HFF00


AddressHi = AddressHi >> 8
AddressLow = _AddressFC16 And &HFF

LengthHi = _Length And &HFF00


LengthHi = _Length >> 8
LengthLow = _Length And &HFF

Quantity = _Length * 2

DataTransmit = New Byte(9 + (2 * _Length)) {}

DataTransmit(0) = _SlaveId
DataTransmit(1) = 16
DataTransmit(2) = AddressHi
DataTransmit(3) = AddressLow
DataTransmit(4) = LengthHi
DataTransmit(5) = LengthLow
DataTransmit(6) = Quantity

For i = 0 To _Length - 1
DataTransmit(7 + (2 * i)) = _DataFC16(i) >> 8
DataTransmit(8 + (2 * i)) = _DataFC16(i) And &HFF
Next
'CRC_Tampung = CRC(7 + (2 * _Length), _SlaveId, 16, AddressHi,
AddressLow, LengthHi, LengthLow, Quantity, DataTransmit())

CRC_Tampung = CRC(7 + (2 * _Length), DataTransmit)

CRC_Hi = CRC_Tampung
CRC_Hi = CRC_Hi And &HFF00
CRC_Hi = CRC_Hi >> 8

CRC_Low = CRC_Tampung
CRC_Low = CRC_Low And &HFF

DataTransmit(7 + (2 * _Length)) = CRC_Low


DataTransmit(7 + (2 * _Length) + 1) = CRC_Hi

', (), (AddressHi), (AddressLow), (ValueRegister_Hi),


(ValueRegister_Low), (CRC_Low), (CRC_Hi)

Return DataTransmit
End Function

Public Function CRC(ByVal nDataInputCRC As Integer, ByVal ParamArray


DataInputCRC() As Byte) As Integer
Dim Const_Polynomial As Integer = &HA001
Dim CRC_u(100) As Integer
Dim Temp_CRC As Integer
'If DataInputCRC.Length <= 0 Then Exit Function 'untuk mengetahui
banyaknya data pada variable array DataInput CRC

CRC = nDataInputCRC
CRC_u(0) = 65535
CRC_u(0) = CRC_u(0) Xor DataInputCRC(0)
For i As Integer = 0 To 7
Temp_CRC = CRC_u(0) And 1
If Temp_CRC = 1 Then
CRC_u(0) = CRC_u(0) >> 1
CRC_u(0) = CRC_u(0) Xor Const_Polynomial
Else
CRC_u(0) = CRC_u(0) >> 1
End If
Next

For j As Integer = 1 To nDataInputCRC - 1


CRC_u(j) = CRC_u(j - 1) Xor DataInputCRC(j)
For k As Integer = 0 To 7
Temp_CRC = CRC_u(j) And 1
If Temp_CRC = 1 Then
CRC_u(j) = CRC_u(j) >> 1
CRC_u(j) = CRC_u(j) Xor Const_Polynomial
Else
CRC_u(j) = CRC_u(j) >> 1
End If
Next
Next
CRC = CRC_u(nDataInputCRC - 1)
Return CRC
End Function

Public Sub ModbusAddressConfig() 'Protocol Address base 0


'untuk Function Code 5 (Output Relay)
AddressPoll_FC5 = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16}
SlaveIdPoll_FC5 = {7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7}

'untuk Function Code 01,02,03,04


' SlaveIdPoll_FC = {1, 2, 7, 7, 7}
' FunctionCodePoll_FC = {3, 3, 1, 2, 4}
' AddressPoll_FC = {3109, 3109, 0, 0, 298}
' LengthPoll_FC = {2, 2, 16, 16, 16}

SlaveIdPoll_FC = {7, 7, 7, 5, 5}
FunctionCodePoll_FC = {1, 2, 3, 3, 3}
AddressPoll_FC = {0, 0, 0, 0, 5}
LengthPoll_FC = {8, 16, 8, 3, 3}
End Sub
End Class

Koneksi database Visual Studio


Imports Microsoft.VisualBasic
Imports System.Data.Sql
Imports System.Data.OleDb
Imports MySql.Data.MySqlClient

Public Class ClsKoneksi


Protected SQL As String
Protected Cn As New MySqlConnection
Protected Cmd As New MySql.Data.MySqlClient.MySqlCommand
Protected Da As New MySql.Data.MySqlClient.MySqlDataAdapter
Protected Ds As New DataSet
Protected Dt As DataTable
Public Function OpenConn() As Boolean
Cn = New MySql.Data.MySqlClient.MySqlConnection("server=localhost;"
_
& "user id=ADRI;" _
&
"password=41119959;" _
&
"database=epark;")
Cn.Open()
If Cn.State <> ConnectionState.Open Then
Return False
Else
Return True
End If
End Function
Public Sub CloseConn()
If Not IsNothing(Cn) Then
Cn.Close()
End If
End Sub
Public Function ExecuteQuery(ByVal Query As String) As DataTable
If Not OpenConn() Then
MsgBox("Koneksi Gagal ..!!", MsgBoxStyle.Critical, "Access
Failed")
Return Nothing
Exit Function
End If
Cmd = New MySql.Data.MySqlClient.MySqlCommand(Query, Cn)
Da = New MySql.Data.MySqlClient.MySqlDataAdapter
Da.SelectCommand = Cmd
Ds = New Data.DataSet
Da.Fill(Ds)
Dt = Ds.Tables(0)
Return Dt
Dt = Nothing
Ds = Nothing
Da = Nothing
Cmd = Nothing
CloseConn()
End Function
Public Sub ExecuteNonQuery(ByVal Query As String)
If Not OpenConn() Then
MsgBox("Koneksi Gagal ..!!", MsgBoxStyle.Critical, "Access
Failed..!!")
Exit Sub
End If
Cmd = New MySql.Data.MySqlClient.MySqlCommand
Cmd.Connection = Cn
Cmd.CommandType = CommandType.Text
Cmd.CommandText = Query
Cmd.ExecuteNonQuery()
Cmd = Nothing
CloseConn()
End Sub
End Class
LAMPIRAN E
GAMBAR REALISASI
Keterangan:
REALISASI PCB DATA CONCENTRATOR
Tampak Depan
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1,072 DTC-ARM0100
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
Keterangan:
REALISASI PCB DATA CONCENTRATOR
Tampak Belakang
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1,072 DTC-ARM0101
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
Keterangan:
REALISASI PCB RTU
Tampak Depan
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1,072 RTU-ARM0100
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
Keterangan:
REALISASI PCB RTU
Tampak Belakang
Skala : Diperiksa : No.
A4
POLITEKNIK 1:1,072 RTU-ARM0101
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
Keterangan:
REALISASI PANEL
Panel Bagian Dalam
No.
Skala : Diperiksa :
A4 Panel-RTUDC-
POLITEKNIK -
0100
NEGERI
Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
Keterangan:
REALISASI PANEL
Panel Bagian Depan
No.
Skala : Diperiksa :
A4 Panel-RTUDC-
POLITEKNIK 1:4,2
0100
NEGERI
Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD
Keterangan:
Digital Tachometer
DTAC-001
Skala : Diperiksa : No.
A4
POLITEKNIK - 001
NEGERI Tgl :
BANDUNG Digambar:
02-07-2018 D4-TOI
ADRI FD

You might also like