IEC 870-5-104ãšã¯äœã§ããïŒã©ãã§äœ¿çšãããŸããïŒ
IEC 60870-5-104ã¯ãTMä¿¡å·ãASTUã«éä¿¡ããããã«èšèšããããã¬ã¡ã«ãã¯ã¹ãããã³ã«ã§ãããTCP / IPãä»ãããããã¯ãŒã¯ã¢ã¯ã»ã¹ã®äœ¿çšãèŠå¶ããŸãã ãšãã«ã®ãŒéšéã§ã¯ããšãã«ã®ãŒã·ã¹ãã éã®æ å ±äº€æãã枬å®ãã©ã³ã¹ãã¥ãŒãµïŒé»å§èšãé»åèšãªã©ïŒããã®ããŒã¿åä¿¡ã«æããã䜿çšãããŸãã
ãããã³ã«ã¹ã¿ãã¯IEC 670-5-104ïŒ
䜿çšææ
- Arduino UNOããŒã
- ã€ãŒãµãããã·ãŒã«ãïŒHR911105aïŒ;
- ABBã®Microscadaã¯ãIEC 60870-5-104ã®ãã¹ã¿ãŒãšããŠæ©èœããŸãã
- ãã©ãã£ãã¯åæã®ããã®Wiresharkã
äœæ¥æ®µéã®ç°¡åãªèª¬æ
- ããŒã2404ã«TCP / IPæ¥ç¶ãã€ã³ã¹ããŒã«ããŸãã
- ããŒã¿è»¢éã®ãªã¯ãšã¹ãã®ç¢ºèªïŒSTARTDT act / conïŒ;
- ã¹ããŒã·ã§ã³ã®äžè¬çãªèª¿æ»ã®ãªã¯ãšã¹ãã
- ãã¹ã¿ãŒã¹ããŒã·ã§ã³ãžã®ããŒã¿ã®æºåãšéä¿¡ã
- è©Šéšæé
æºåãã
- PCã«æ¥ç¶ãããArduinoããŒãã
- ãããã¯ãŒã¯ã€ã³ã¿ãŒãã§ã€ã¹ã¯ããã«å¿ããŠæ§æãããŸãã
- ãã¹ã¿ãŒã¹ããŒã·ã§ã³ãæ§æãããŸããïŒ104è¡ãè¿œå ãããã¹ã¬ãŒãããã€ã¹ãè¿œå ãããŸããïŒã
çšèªãšç¥èª
APCI-ã¢ããªã±ãŒã·ã§ã³ã¬ãã«å¶åŸ¡æ å ±ã¯ãã¹ã¿ã³ãã¢ãã³ã®å¶åŸ¡ãã¬ãŒã ïŒUãã¬ãŒã ãŸãã¯Sãã¬ãŒã ïŒãšããŠäœ¿çšã§ããŸãã
ASDU-ã¢ããªã±ãŒã·ã§ã³ã¬ãã«ã®ããŒã¿ãããã¯ã¯ãããŒã¿ãããã¯èå¥åãš1ã€ä»¥äžã®æ å ±ãªããžã§ã¯ãã§æ§æãããåãªããžã§ã¯ãã«ã¯1ã€ä»¥äžã®åçš®ã®æ å ±èŠçŽ ïŒãŸãã¯æ å ±èŠçŽ ã®çµã¿åããïŒãå«ãŸããŸãã
APDU-ã¢ããªã±ãŒã·ã§ã³å±€ã®ãããã³ã«ããŒã¿ãŠãããã
TS-ãã¬ã¢ã©ãŒã ã
TI-ãã¬ã¡ããªãŒã
TU-ãã¬ã³ã³ãããŒã«ã
1. TCP / IPæ¥ç¶ããŒã2404ã確ç«ããŸã
ãã¹ã¿ãŒã¹ããŒã·ã§ã³ã¯ããã©ã°ïŒSYSïŒä»ãã®TCPãã±ãããéä¿¡ããããšã«ãããTCPæ¥ç¶ãéå§ããŸãã æ¥ç¶ã¯ãç£èŠæéïŒt0ïŒã®éã«ãç£èŠå¯Ÿè±¡ã¹ããŒã·ã§ã³ïŒã¹ã¬ãŒãïŒãTCP / IPã¬ãã«ã«ãã¢ã¯ãã£ããªãªãŒãã³ã確èªïŒSYS ACKïŒãçºè¡ããå Žåã«ç¢ºç«ããããšèŠãªãããŸãã å¶åŸ¡æét0ã¯ãæ¥ç¶ã»ããã¢ããã¿ã€ã ã¢ãŠãããšåŒã°ããŸãã ã¿ã€ããŒt0ã¯ããªãŒãã³ããã€ãã£ã³ã»ã«ããããã決å®ããæ°ããæ¥ç¶è©Šè¡ã®éå§ã決å®ããŸããã
ãã©ã³ã¹ããŒãå±€ãšã®çžäºäœçšã¯ãArduino Ethernet.hããŒãã®æšæºã©ã€ãã©ãªã«ãã£ãŠå®è¡ãããŸãã ã€ãŸãããŸããå¶åŸ¡ã¹ããŒã·ã§ã³ãšç£èŠã¹ããŒã·ã§ã³ã®éã§TCP / IPæ¥ç¶ã確ç«ããå¿ èŠããããŸãã ãããè¡ãã«ã¯ãArduinoã¹ã±ããã§ãããã€ã¹ãåæåããæå®ãããããŒããä»ããçä¿¡æ¥ç¶ãåŸ æ©ãããµãŒããŒãäœæããŸãã
ã¹ã±ãã
#include <Ethernet.h> byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB7 };// IPAddress ip(172, 16, 7, 1);// ip IPAddress gateway(172, 16,7, 0);// IPAddress subnet(255, 255, 0, 0);// EthernetClient client; EthernetServer iec104Server(2404);// 670-5-104- - 2404 void setup() { Ethernet.begin(mac, ip, gateway, subnet); // Ethernet- } void loop() { client = iec104Server.available();// }
ãã®ã¹ã±ãããããŠã³ããŒããããšã次ã®ããšãèµ·ãããŸãã
æ¥ç¶ã確ç«ãããšãArduinoã«äžæãªSTARTDT actããã±ãŒãžãæ¥ãŠãäžå®æéåŸã«æ¥ç¶ãåæãããŸãã 次ã«ãSTARTDTè¡çºãšã¯äœããç解ããå¿ èŠããããŸãã
2.ããŒã¿è»¢éã®ãªã¯ãšã¹ãã®ç¢ºèªïŒSTARTDT act / conïŒ
IEC 670-5-104ã«ã¯ãäŒéçšã®3çš®é¡ã®ãã©ãŒãããããããŸãã
- ãã¬ã¡ããªããŒã¿ãéä¿¡ããããã®Iãã©ãŒãããã
- ã¬ã·ãŒããéä¿¡ããããã®Sãã©ãŒãããã
- é信確ç«ãã±ããã®éä¿¡ããã³éä¿¡ãã£ãã«ã®ãã¹ãã®ããã®Uãã©ãŒãããã
ãããªãã«ãã³ãã·ã§ã€ã¯ããæåãããšããã¹ã¿ãŒã¹ããŒã·ã§ã³ã¯APDU STARTDTïŒããŒã¿è»¢ééå§ïŒãéä¿¡ããŸãã STARTDTã¯ãå¶åŸ¡ïŒãã¹ã¿ãŒïŒã®æ¹åã«ASDUïŒãã¬ãŒã IïŒã転éããå¶åŸ¡ïŒã¹ã¬ãŒãïŒã¹ããŒã·ã§ã³ã®èš±å¯ãéå§ããæäœãç¶è¡ããã«ã¯ãå¶åŸ¡ïŒã¹ã¬ãŒãïŒã¹ããŒã·ã§ã³ãããŒã¿ãããã¯ãéä¿¡ããæºåãã§ããŠããå Žåã«STARTDTã確èªããå¿ èŠããããŸãã ã¹ã¬ãŒãã¹ããŒã·ã§ã³ãSTARTDTã確èªããªãå Žåããã¹ã¿ãŒã¹ããŒã·ã§ã³ã¯IPæ¥ç¶ãéããŸãã
åç
ãããã£ãŠãããã«ãå¶åŸ¡ïŒãã¹ã¿ãŒïŒã¹ããŒã·ã§ã³ããåä¿¡ãããã€ããèªã¿åã£ãŠè§£æããå¿ èŠããããŸãã
ã¹ã±ãã
uint8_t iec104ReciveArray[128];// EthernetClient client = iec104Server.available(); if(client.available()) { delay(100); int i = 0; while(client.available()) { iec104ReciveArray[i] = client.read();// i++; }
ããŒã¿ãèªã¿åã£ãåŸããããã解æããŠåçãäœæããå¿ èŠããããŸãã
Wireshark
Wiresharkã®STARTDTãããã¯ãå«ãããã±ãŒãžã¯æ¬¡ã®ããã«ãªããŸããAPDUã¯ãAPCIã®ã¿ã§æ§æãããUãã©ãŒããããããã¯ã§ãã
APCI - Application Level Control Informationã¯ãã¹ã¿ã³ãã¢ãã³ã®å¶åŸ¡ãã¬ãŒã ïŒUãã¬ãŒã ãŸãã¯Sãã¬ãŒã ïŒãšããŠäœ¿çšã§ããŸãã
ã€ãŸããAPCIã¯APDUã®ã¿ã€ããšãã®é·ãã決å®ããŸãã APCIã¯ã次ã®6ãã€ãã§æ§æãããŠããŸãã
1.ãã€ãSTART2 68hããå§ãŸãAPDUå¯å€é·ã®åæåã®ãµã€ã³ã
2.ãã®äŸã§ã¯ãAPDU ã®é·ãã¯4ãã€ãã§ãã
3. APDUã¿ã€ãã決å®ãããå¶åŸ¡ãã€ãããã®äŸã§ã¯ãå€7ãæžã蟌ãŸããŸããããã¯ãããŒã¿è»¢éã®èŠæ±ãæå³ããŸãã
4,5,6䜿çšãããŠããŸããã
äžèšã«åºã¥ããŠãåçããåã«ãç£èŠã¹ããŒã·ã§ã³ãã©ã®ã¿ã€ãã®APDUãéä¿¡ããããå€æããŠãåé¡ã¯ãããŸããã APDUã¿ã€ããAPCIãããã¯ã®èªã¿åãã®3çªç®ã®ãã€ãé ã§æžã蟌ãŸããããšãç¥ã£ãŠãæŽæ°å€æ°ã«ä¿åããŸãã
泚ïŒãã©ãŒããããIãã®ãã±ãããåä¿¡ããå ŽåãAPCIã®3ãã€ãã«ã¯ãåä¿¡ãããã±ããã®ã«ãŠã³ã¿ãŒã®äžäœã¯ãŒãã®å€ãå«ãŸããŸãã
ãããã£ãŠãAPDUã¿ã€ãå®çŸ©ã®æ§ç¯ãå°ãè€éã«ããå¿ èŠããããŸããã
ã¹ã±ãã
ASDU=iec104ReciveArray[6];// ASDU? switch (ASDU) { case 100:// TypeQuerry=iec104ReciveArray[2]-word(iec104ReciveArray[3],iec104ReciveArray[2]);// rxcnt+=2;// break; case 0: TypeQuerry=iec104ReciveArray[2]; // break; default : TypeQuerry=iec104ReciveArray[2];// break; }
äžèšã®å³ãããå€7ã«å¯Ÿå¿ããAPDUã¿ã€ãã¯STARTDTè¡çºã§ããããšãããããŸãããããã£ãŠãæ§é å ã®åããã±ããã§å¿çããå¿ èŠããããã¿ã€ãå€ã®ã¿ã«å€11ïŒ0bïŒãå¿ èŠã§ããããã¯STARTDT conã«å¯Ÿå¿ããŸãã
ã¹ã±ãã
#include <Ethernet.h> byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB7 }; IPAddress ip(172, 16, 7, 1); IPAddress gateway(172, 16,7, 0); IPAddress subnet(255, 255, 0, 0); EthernetClient client; EthernetServer iec104Server(2404); int TypeQuerry, MessageLength;// APDU uint8_t iec104ReciveArray[128];// APDU void setup() { Ethernet.begin(mac, ip, gateway, subnet); } void loop() { client = iec104Server.available(); if(client.available())// { delay(100); int i = 0; while(client.available())// { iec104ReciveArray[i] = client.read();// i++; } TypeQuerry= iec104ReciveArray[2];// APDU switch(TypeQuerry) { case 07:// STARTDT iec104ReciveArray[0]=iec104ReciveArray[0];// START2 = 68h; iec104ReciveArray[1]=iec104ReciveArray[1];// APDU iec104ReciveArray[2] = iec104ReciveArray[2]+4; // APDU iec104ReciveArray[3]=0; iec104ReciveArray[4]=0; iec104ReciveArray[5]=0; MessageLength = iec104ReciveArray[1]+2;// + 2 Start and Lenght APCI delay(100); client.write(iec104ReciveArray, MessageLength);// break; } } }
ã¹ã±ãããæŽæ°ããåŸã次ã®äº€æé åºã確èªããŸãã
æ¥ç¶ã®ç¢ºç«ãããŒã¿éä¿¡ã®èŠæ±ãèŠæ±ã®ç¢ºèªãããã«å¥ã®æ°ãããŸã æªç¥ã®APDU圢åŒIã¿ã€ã1 C_IC_NA Actã
3.äžè¬çãªã¹ããŒã·ã§ã³èª¿æ»ã®ãªã¯ãšã¹ã
ããŒãªã³ã°ããŒã C_IC ACTã¯ããã«ããªã¥ãŒã ãŸãã¯ããŒãªã³ã°ãããæ å ±ã®ç¹å®ã®ãµãã»ãããCPã«èŠæ±ããŸãã ãµãã»ããïŒã°ã«ãŒãïŒã¯ãQOIããŒãªã³ã°èšè¿°åã䜿çšããŠéžæãããŸãã
ã¹ããŒã·ã§ã³å°åããŒã ã¯ãã¹ããŒã·ã§ã³ã«æ å ±ã®çŸåšã®ã¹ããŒã¿ã¹ãéä¿¡ããããšãèŠæ±ããŸããéåžžã¯ãæ£çºçã«éä¿¡ãããŸãïŒéä¿¡çç±= 3ïŒã<20>ãã<36>ã®éä¿¡çç±ã§ç£èŠã¹ããŒã·ã§ã³ã«éä¿¡ããŸãã ã¹ããŒã·ã§ã³ããŒãªã³ã°ã¯ãå¶åŸ¡ã¹ããŒã·ã§ã³ãšå¶åŸ¡ã¹ããŒã·ã§ã³ã§ããã»ã¹æ å ±ãåæããããã«äœ¿çšãããŸãã ãŸããåæåæé ã®åŸããŸãã¯ç£èŠã¹ããŒã·ã§ã³ããã£ãã«æ倱ïŒãªã³ã¯å±€èŠæ±ã®å€±æã®ç¹°ãè¿ãïŒããã³ãã®åŸã®åŸ©å ãæ€åºããåŸãç£èŠã¹ããŒã·ã§ã³ã§æ å ±ãæŽæ°ããããã«ã䜿çšãããŸãã ã¹ããŒã·ã§ã³ããŒãªã³ã°ãžã®å¿çã«ã¯ãç£èŠå¯Ÿè±¡ã®ã¹ããŒã·ã§ã³ã«ä¿åãããŠããããã»ã¹æ å ±ãªããžã§ã¯ããå«ããå¿ èŠããããŸãã ã¹ããŒã·ã§ã³ããŒãªã³ã°ã«å¿çããŠããããã®æ å ±ãªããžã§ã¯ãã¯ãã¿ã€ã<1>ã<3>ã<5>ã<7>ã<9>ã<11>ã<13>ã<20>ãŸãã¯<21>ã®èå¥åã§éä¿¡ãããŸããã¿ã€ãèå¥åã<1>ãã<14>ã<20>ã<21>ã<30>ãã<36>ã§ä»ã®ASDUã«è»¢éãããéä¿¡çç±<1>-å®æç/åšæçã«ã<2>-ããã¯ã°ã©ãŠã³ãã¹ãã£ã³ãŸãã¯<3>-æ£çºçã«ã
åç
APDU <100> C_IC_NA_1ã¯ãAPCIãããã¯ã«å ããŠãASDUãããã¯ïŒã¢ããªã±ãŒã·ã§ã³å±€ããŒã¿ãããã¯ïŒãåããŠãããããããäžç·ã«ãªã£ãŠAPDUãããã³ã«ããŒã¿ãŠãããã圢æããŸãã
çµæã®APDUããã詳现ã«æ€èšããŠãã ããã
APCIïŒ
- æåã®ãã€ãã¯ã¿ã€ã0ã瀺ããããã¯ããŒãªã³ã°ã³ãã³ãã§ããããšãæå³ããŸãã
- 2çªç®ã§ã¯ãAPDUã®é·ãã¯14ãã€ãã§ãã
ASDUïŒ
- ASDUã®æåã®ãã€ãã¯ãæ å ±ãªããžã§ã¯ãã®ã¿ã€ãã決å®ããŸãããã®å Žåã¯<100> C_IC_NA_1ïŒäžè¬çãªã¹ããŒã·ã§ã³ããŒãªã³ã°ïŒã§ãã
- ããŒã¿ãããã¯ã®2çªç®ã®æ§é ã
- 転éã®3çªç®ã®çç±ïŒCauseTxïŒãå€6ã¯ã¢ã¯ãã£ããŒã·ã§ã³èŠæ±ãæå³ããŸãã
- åœã®4çªç®ã®å ±éäœæã
- ã¹ã¬ãŒãã¹ããŒã·ã§ã³ã®5çªç®ã®ã¢ãã¬ã¹ã
- æ å ±ãªããžã§ã¯ãã®6çªç®ãã8çªç®ã®ã¢ãã¬ã¹ã¯ãŒãã§ãã
- 9çªç®ã®æ å ±ãã€ã-QOI-次ã®å€ãæã€ãªã¯ãšã¹ãèšè¿°åïŒ
<100> C_IC_NA_1ãžã®å¿çãšããŠãèŠæ±ã«å¯Ÿãã確èªã§å¿çãã被å¶åŸ¡ã¹ããŒã·ã§ã³ã«ä¿åãããŠããããã»ã¹æ å ±ãªããžã§ã¯ãã転éããã¢ã¯ãã£ããŒã·ã§ã³ãå®äºããå¿ èŠããããŸãã
確èªãéä¿¡ããã«ã¯ãASDU <100> C_IC_NA_1ã«è»¢éã®çç±ïŒCauseTXïŒã瀺ããã€ãã7ã«çããå€ãæžã蟌ãå¿ èŠããããŸããã¢ã¯ãã£ããŒã·ã§ã³å®äºãéä¿¡ããã«ã¯ã転éã®çç±ïŒCauseTXïŒã«10ã«çãããã€ããæžã蟌ãå¿ èŠããããŸãã
ã¹ã±ãã
case 00:// txcnt=txcnt+02; // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=iec104ReciveArray[1]; iec104ReciveArray[2]=lowByte(txcnt);//TX L iec104ReciveArray[3]=highByte(txcnt);//TX H iec104ReciveArray[4]=lowByte(rxcnt);//RX L iec104ReciveArray[5]=highByte(rxcnt);//RX H iec104ReciveArray[6]=100;// iec104ReciveArray[7]=01; iec104ReciveArray[8]=7;//cause Actcon iec104ReciveArray[9]=00;//OA iec104ReciveArray[10]=01;//Addr iec104ReciveArray[11]=00;//Addr iec104ReciveArray[12]=00;//IOA iec104ReciveArray[13]=00;//IOA iec104ReciveArray[14]=00;//IOA iec104ReciveArray[15]=20;//IOA, QOI MessageLength = iec104ReciveArray[1]+2; delay(100); client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+2;// // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14;// APDU=APCI(4)+ ASDU(10) iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=1;//type 1 iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=20;//Cause Inrogen iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[0];//IOA iec104ReciveArray[13]=iecData[1];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[2];//value [DATA 1] MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=1;//type 1 bool iec104ReciveArray[7]=01; iec104ReciveArray[8]=20;//Cause Inrogen iec104ReciveArray[9]=00; iec104ReciveArray[10]=01; iec104ReciveArray[11]=00; iec104ReciveArray[12]=iecData[3]; iec104ReciveArray[13]=iecData[4]; iec104ReciveArray[14]=0; iec104ReciveArray[15]=iecData[5]; MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=22; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=11;//type 11 int iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=20;//Cause Inrogen iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[6];//IOA iec104ReciveArray[13]=iecData[7];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[8];//value [DATA 1] iec104ReciveArray[16]=iecData[9];//value [DATA 1] iec104ReciveArray[17]=iecData[10];//QDS iec104ReciveArray[18]=iecData[11];//IOA iec104ReciveArray[19]=iecData[12];//OA iec104ReciveArray[20]=0;//IOA iec104ReciveArray[21]=iecData[13];//value [DATA 2] iec104ReciveArray[22]=iecData[14];//value [DATA 2] iec104ReciveArray[23]=iecData[15];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=26; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=13;//type 13 Float iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=20;//Cause Inrogen iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[16];//IOA iec104ReciveArray[13]=iecData[17];//IOA iec104ReciveArray[14]=0; iec104ReciveArray[15]=iecData[18];//value [DATA 1] iec104ReciveArray[16]=iecData[19];//value [DATA 1] iec104ReciveArray[17]=iecData[20];//value [DATA 1] iec104ReciveArray[18]=iecData[21];//value [DATA 1] iec104ReciveArray[19]=iecData[22];//IOA QDS iec104ReciveArray[20]=iecData[23];//IOA iec104ReciveArray[21]=iecData[24];//IOA iec104ReciveArray[22]=0;//IOA iec104ReciveArray[23]=iecData[25];//value [DATA 2] iec104ReciveArray[24]=iecData[26];//value [DATA 2] iec104ReciveArray[25]=iecData[27];//value [DATA 2] iec104ReciveArray[26]=iecData[28];//value [DATA 2] iec104ReciveArray[27]=iecData[29];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+2; // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=iec104ReciveArray[1]; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=100;//type iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=10;//cause AckTerm iec104ReciveArray[9]=00; iec104ReciveArray[10]=01; iec104ReciveArray[11]=00; iec104ReciveArray[12]=00; iec104ReciveArray[13]=00; iec104ReciveArray[14]=00; iec104ReciveArray[15]=20; MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); iec104ReciveArray[6]=00;// break;
ã¹ã±ãããæŽæ°ããåŸã次ã®äº€æé åºã確èªããŸãã
æ¥ç¶ã®ç¢ºç«ãããŒã¿éä¿¡ã®èŠæ±ã確èªãå¶åŸ¡å±ããã®ã¹ããŒã·ã§ã³ã®äžè¬çãªåãåããã®èŠæ±ãåæåã®å®äºãå¶åŸ¡ãããã¹ããŒã·ã§ã³ã®æ¹åã§ã®ã¹ããŒã·ã§ã³ã®äžè¬çãªåãåããã®èŠæ±ãäžè¬çãªåãåããã®ç¢ºèªãå¶åŸ¡ã¹ããŒã·ã§ã³ã§å©çšå¯èœãªãã¹ãŠã®ä¿¡å·ã®å€ã®éä¿¡ãäžè¬çãªåãåããããã³æªç¥ã®å®äºAPCIãã©ãŒãããS
ã¹ããŒã·ã§ã³ããŒãªã³ã°èŠæ±ã¯ãç£èŠãããŠããã¹ããŒã·ã§ã³ã®æ¹åã«çºè¡ãããŸãã
-ãåæåã®çµäºãã被å¶åŸ¡ã¹ããŒã·ã§ã³ããåä¿¡ãããå ŽåããŸãã¯
-äžå€®å±ããã£ãã«ã®æ倱ïŒããŒã¿ãªã³ã¯ã¬ã€ã€ãŒã®èŠæ±ã®ç¹°ãè¿ãã®å€±æïŒãšãã®åŸã®åŸ©å ãæ€åºããå Žåã
4.æºåãšããŒã¿è»¢é
APCIã®ã¿ã§æ§æãããAPDU Sãã©ãŒããããŠãããã¯ãæ¡çšãããAPDU Iãã©ãŒãããã確èªããããã®ãã®ã§ãã Sãã©ãŒãããã®å Žåããã€ã1ããã³ãã€ã2ã®ãµãŒãã¹ãã£ãŒã«ãã®äžäœ7ãããã¯äœ¿çšãããããã€ã3ïŒäžäœ7ãããïŒããã³ãã€ã4ã¯åä¿¡ã¡ãã»ãŒãžã®çŸåšã®æ°ã決å®ããŸãã
ãã®å Žåããããã¯Sã¯ãå¶åŸ¡ïŒãã¹ã¿ãŒïŒã¹ããŒã·ã§ã³ããå¶åŸ¡ïŒãã¹ã¿ãŒïŒã¹ããŒã·ã§ã³ã®åŽã§å®çŸ©ãããã¿ã€ã ã¢ãŠãt3ãè¶ ããªãäžå®æéå ã«ããŒã¿ãåä¿¡ããæºåãã§ããŠããããšã瀺ããŸãã ã€ãŸãããã¹ã¿ãŒã¹ããŒã·ã§ã³ãããããŒã¿ãåä¿¡ããæºåãã§ããŸããïŒã 次ã«ã転éããããŒã¿ãšãã®ååŸå ã«æ³šæããå¿ èŠããããŸãã
äœãéä¿¡ã§ããŸããïŒ IEC 870-5-104ã«ã¯ãããã€ãã®ã¿ã€ãã®æ å ±ãå®çŸ©ãããŠããŸãã
- ã³ã³ãããŒã«;
- ãããŒãžã£ãŒ;
- ãã©ã¡ãŒã¿;
- ãã¡ã€ã«è»¢éã
åç
ãã®äŸã§ã¯ã1ã11ãããã³13ã®æ©èœïŒåäžèŠçŽ ã枬å®ã¯ã¹ã±ãŒã©ãã«ã枬å®ã¯æµ®åå°æ°ç¹ã䜿çšããçã圢åŒïŒã®äŸã«ããå¶åŸ¡æ å ±ã®éä¿¡ãèæ ®ããŠããŸãã ããŒã¿ã¯ã©ã³ãã ã«çæãããŸãã ãŸããåéä¿¡ä¿¡å·ã«å質ãã€ããããããšãèæ ®ããå¿ èŠããããŸãã
ä¿¡å·å質ã決å®ããããã®ç°¡åãªã¢ã«ãŽãªãºã ïŒ
- ã¢ã¯ãã£ãä¿¡å·ã®çœ®æã䜿çšãããå ŽåãBLïŒããããã³ã°ïŒããã³SBïŒçœ®æïŒãã©ã°ãèšå®ãããŸãã
- å¶åŸ¡æéäžã«ä¿¡å·å€ãå€æŽãããŠããªãå ŽåãNTãã©ã°ãèšå®ãããŸãïŒé¢ä¿ãããŸããïŒã
- äžäœã¬ãã«ã®ããŒããŸãã¯ããã€ã¹ïŒã»ã³ãµãŒãŸãã¯ãã®ä»ïŒã®åäœäžèœã®å åãããå Žåããã©ã°IVãèšå®ãããŸãïŒä¿¡é Œã§ããå€ã§ã¯ãããŸããïŒã
ã¹ã±ãã
void SetQDS(int currvalue, int i,bool zam)// { if (zam==0)//? { if (currvalue==previusValue[i])// ? { previusValue[i]=currvalue; counter[i]+=1; if (counter[i]>=1000) { qds[i]=64;// NT counter[i]=0; } } else { qds[i]=0; counter[i]=0; previusValue[i]=currvalue; } } else { qds[i]=48;// SB, BL } }
ãŸããä¿¡å·ããšã«äžæã®IOAèå¥åãååšããããšãèæ ®ããå¿ èŠããããŸããé»åæ¥çã§ã¯ããããã®ã¢ãã¬ã¹ã次ã®ããã«é åžããã®ãäžè¬çã§ãã
- 4096ããéå§ããTSã
- TIã¯8192ããå§ãŸããŸãã
- 20480ããå§ãŸãTUã
éä¿¡ã®ããã«ä¿¡å·å€ãã¢ã¬ã€ã«è»¢éããã«ã¯ãEEPROMã©ã€ãã©ãªã䜿çšããŸãã
ã¹ã±ãã
void EEPROM_float_write(int addr, float val,int IOA,int number,bool subs) // EEPROM, , , , { SetQDS(val,number, subs);// byte *x = (byte *)&val;//float -->byte byte *xxx = (byte *)&IOA;// IOA for(int jj = 0; jj <2; jj++) { EEPROM.write(addr,xxx[jj]);// EEPROM 2 addr+=1; } for(byte i = 0; i < 4; i++) // float 4 { EEPROM.write(addr, x[i]); // float 4 addr+=1; } EEPROM.write(addr, qds[number]);// if (addr == EEPROM.length()) { addr = 0; } }
ãããã£ãŠãç£èŠã¹ããŒã·ã§ã³ããSãŸãã¯Iãã©ãŒãããã®APDU確èªãåä¿¡ãããšãéä¿¡ãã¬ãŒã ã®æ°ãå¢ããããšãå¿ããã«ã䜿çšå¯èœãªããŒã¿ã®éä¿¡ãéå§ã§ããŸãã
ã¹ã±ãã
#include <eeprom.h> #include <Ethernet.h> #include <eeprom.h> byte mac[] = {0x90, 0xA2, 0xDA, 0x0E, 0x94, 0xB7 }; IPAddress ip(172, 16, 7, 1); IPAddress gateway(172, 16,7, 0); IPAddress subnet(255, 255, 0, 0); EthernetClient client; EthernetServer iec104Server(2404); int TypeQuerry, MessageLength; uint8_t iec104ReciveArray[128]; int counter[6];// int qds[6];// int previusValue[6];// NT word iecData[256];// int ASDU;// int txcnt, rxcnt;// void setup() { // 2404 Ethernet.begin(mac, ip, gateway, subnet); Serial.begin(9600); } void EEPROM_float_write(int addr, float val,int IOA,int number,bool zam) // Float 13 { SetQDS(val,number,zam);// byte *x = (byte *)&val; byte *xxx = (byte *)&IOA; for(int jj = 0; jj <2; jj++)// IOA 2 { EEPROM.write(addr,xxx[jj]); addr+=1; } for(byte i = 0; i < 4; i++)// float 4 { EEPROM.write(addr, x[i]); addr+=1; } EEPROM.write(addr, qds[number]); if (addr == EEPROM.length()) { addr = 0; } } void EEPROM_byte_write(int addr, bool val,int IOA,int number,bool zam) // Bool 1 { SetQDS(val,number,zam);// byte c=val+qds[number]; byte *x = (byte *)&c; byte *xxxx = (byte *)&IOA; for(int jj = 0; jj <2; jj++) // IOA 2 { EEPROM.write(addr,xxxx[jj]); addr+=1; } for(byte i = 0; i < 1; i++) // bool + 1 { EEPROM.write(addr, x[i]); } if (addr == EEPROM.length()) { addr = 0; } } void EEPROM_int_write(int addr, int val, int IOA,int number,bool zam) // Int 11 { SetQDS(val,number,zam); // byte *x = (byte *)&val; byte *xx = (byte *)&IOA; for(int jj = 0; jj <2; jj++)// IOA 2 { EEPROM.write(addr,xx[jj]); addr+=1; } for(byte i = 0; i < 2; i++)// int 2 a { EEPROM.write(addr, x[i]); addr+=1; } EEPROM.write(addr, qds[number]); if (addr == EEPROM.length()) { addr = 0; } } // void SetQDS(int currvalue, int i,bool zam)// , , { if (zam==0)//? { if (currvalue==previusValue[i])// ? { previusValue[i]=currvalue; counter[i]+=1; if (counter[i]>=1000) { qds[i]=64;// NT counter[i]=0; } } else { qds[i]=0; counter[i]=0; previusValue[i]=currvalue; } } else { qds[i]=48;// } } void loop() { // 1,11,13 // : ( EEPROM, , IOA , ) EEPROM_byte_write(0,0,4096,0,0); EEPROM_byte_write(3,random(0, 2),4097,1,1); EEPROM_int_write(6, 67,8192,2,1); EEPROM_int_write(11, random(10, 20),8193,3,0); EEPROM_float_write(16, random(-1000, 2000),8194,4,1); EEPROM_float_write(23, 78.66f,8195,5,1); client = iec104Server.available(); if(client.available()) { delay(100); int i = 0; while(client.available()) { iec104ReciveArray[i] = client.read();// i++; } ASDU=iec104ReciveArray[6];// ASDU? switch (ASDU) { case 100:// TypeQuerry=iec104ReciveArray[2]-word(iec104ReciveArray[3],iec104ReciveArray[2]); rxcnt+=2;// break; case 0: TypeQuerry=iec104ReciveArray[2];// break; default : TypeQuerry=iec104ReciveArray[2]; break; } for(byte z = 0; z <64; z++) // { iecData[z]= EEPROM.read(z); } // APDU switch(TypeQuerry) { case 07://APDU STARTDT rxcnt=0; txcnt=0; iec104ReciveArray[0]=iec104ReciveArray[0];// , START2 = 68h; iec104ReciveArray[1]=iec104ReciveArray[1];// APDU iec104ReciveArray[2]=11;//STARTDT con iec104ReciveArray[3]=0; iec104ReciveArray[4]=0; iec104ReciveArray[5]=0; MessageLength = iec104ReciveArray[1]+2;// client.write(iec104ReciveArray, MessageLength);// // iec104ReciveArray[0]=iec104ReciveArray[0];// , START2 = 68h; iec104ReciveArray[1]=14;// APDU iec104ReciveArray[2]=0;//, TX L iec104ReciveArray[3]=0;//TX H iec104ReciveArray[4]=0;//RX L iec104ReciveArray[5]=0;//RX H iec104ReciveArray[6]=70;//type End of Init iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=04;//cause Init iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=00;//IOA iec104ReciveArray[13]=00;//IOA iec104ReciveArray[14]=00;//IOA iec104ReciveArray[15]=129;//IOA, COI MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14;// APDU iec104ReciveArray[2]=2;//TX L iec104ReciveArray[3]=0;//TX H iec104ReciveArray[4]=0;//RX L iec104ReciveArray[5]=0;//RX H iec104ReciveArray[6]=100;// iec104ReciveArray[7]=01; iec104ReciveArray[8]=6;//cause Act iec104ReciveArray[9]=00; iec104ReciveArray[10]=01; iec104ReciveArray[11]=00; iec104ReciveArray[12]=00; iec104ReciveArray[13]=00; iec104ReciveArray[14]=00; iec104ReciveArray[15]=20;//IOA, QOI MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+02; break; case 00:// txcnt=txcnt+02; // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=iec104ReciveArray[1]; iec104ReciveArray[2]=lowByte(txcnt);//TX L iec104ReciveArray[3]=highByte(txcnt);//TX H iec104ReciveArray[4]=lowByte(rxcnt);//RX L iec104ReciveArray[5]=highByte(rxcnt);//RX H iec104ReciveArray[6]=100;// iec104ReciveArray[7]=01; iec104ReciveArray[8]=7;//cause Actcon iec104ReciveArray[9]=00;//OA iec104ReciveArray[10]=01;//Addr iec104ReciveArray[11]=00;//Addr iec104ReciveArray[12]=00;//IOA iec104ReciveArray[13]=00;//IOA iec104ReciveArray[14]=00;//IOA iec104ReciveArray[15]=20;//IOA, QOI MessageLength = iec104ReciveArray[1]+2; delay(100); client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+2;// // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14;// APDU=APCI(4)+ ASDU(10) iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=1;//type 1 iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=20;//Inrogen iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[0];//IOA iec104ReciveArray[13]=iecData[1];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[2];//value [DATA 1] MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=1; iec104ReciveArray[7]=01; iec104ReciveArray[8]=20; iec104ReciveArray[9]=00; iec104ReciveArray[10]=01; iec104ReciveArray[11]=00; iec104ReciveArray[12]=iecData[3]; iec104ReciveArray[13]=iecData[4]; iec104ReciveArray[14]=0; iec104ReciveArray[15]=iecData[5]; MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=22; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=11;//type 11 iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=20;//cause iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[6];//IOA iec104ReciveArray[13]=iecData[7];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[8];//value [DATA 1] iec104ReciveArray[16]=iecData[9];//value [DATA 1] iec104ReciveArray[17]=iecData[10];//QDS iec104ReciveArray[18]=iecData[11];//IOA iec104ReciveArray[19]=iecData[12];//OA iec104ReciveArray[20]=0;//IOA iec104ReciveArray[21]=iecData[13];//value [DATA 2] iec104ReciveArray[22]=iecData[14];//value [DATA 2] iec104ReciveArray[23]=iecData[15];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=26; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=13;//type 13 iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=20;//cause iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[16];//IOA iec104ReciveArray[13]=iecData[17];//IOA iec104ReciveArray[14]=0; iec104ReciveArray[15]=iecData[18];//value [DATA 1] iec104ReciveArray[16]=iecData[19];//value [DATA 1] iec104ReciveArray[17]=iecData[20];//value [DATA 1] iec104ReciveArray[18]=iecData[21];//value [DATA 1] iec104ReciveArray[19]=iecData[22];//IOA QDS iec104ReciveArray[20]=iecData[23];//IOA iec104ReciveArray[21]=iecData[24];//IOA iec104ReciveArray[22]=0;//IOA iec104ReciveArray[23]=iecData[25];//value [DATA 2] iec104ReciveArray[24]=iecData[26];//value [DATA 2] iec104ReciveArray[25]=iecData[27];//value [DATA 2] iec104ReciveArray[26]=iecData[28];//value [DATA 2] iec104ReciveArray[27]=iecData[29];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); txcnt=txcnt+2; // iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=iec104ReciveArray[1]; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=100;//type iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=10;//cause AckTerm iec104ReciveArray[9]=00; iec104ReciveArray[10]=01; iec104ReciveArray[11]=00; iec104ReciveArray[12]=00; iec104ReciveArray[13]=00; iec104ReciveArray[14]=00; iec104ReciveArray[15]=20; MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); iec104ReciveArray[6]=00;// break; //APDU S case 01: txcnt=word(iec104ReciveArray[5],iec104ReciveArray[4]); iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=1;//type 1 iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=01;//cause Cycl iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[0];//IOA iec104ReciveArray[13]=iecData[1];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[2];//value [DATA 1] MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=14; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=1;//type 1 Bool iec104ReciveArray[7]=01;//sq iec104ReciveArray[8]=01;//cause Cycl iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[3];//IOA iec104ReciveArray[13]=iecData[4];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[5];//value [DATA 1] MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=22; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=11;//type 11 Int iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=01;//cause Cycl iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[6];//IOA iec104ReciveArray[13]=iecData[7];//IOA iec104ReciveArray[14]=0;//IOA iec104ReciveArray[15]=iecData[8];//value [DATA 1] iec104ReciveArray[16]=iecData[9];//value [DATA 1] iec104ReciveArray[17]=iecData[10];//QDS iec104ReciveArray[18]=iecData[11];//IOA iec104ReciveArray[19]=iecData[12];//OA iec104ReciveArray[20]=0;//IOA iec104ReciveArray[21]=iecData[13];//value [DATA 2] iec104ReciveArray[22]=iecData[14];//value [DATA 2] iec104ReciveArray[23]=iecData[15];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); delay(5); txcnt=txcnt+2; iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=26; iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=13;//type 13 Float iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=01;//cause Cycl iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[16];//IOA iec104ReciveArray[13]=iecData[17];//IOA iec104ReciveArray[14]=0; iec104ReciveArray[15]=iecData[18];//value [DATA 1] iec104ReciveArray[16]=iecData[19];//value [DATA 1] iec104ReciveArray[17]=iecData[20];//value [DATA 1] iec104ReciveArray[18]=iecData[21];//value [DATA 1] iec104ReciveArray[19]=iecData[22];//IOA QDS iec104ReciveArray[20]=iecData[23];//IOA iec104ReciveArray[21]=iecData[24];//IOA iec104ReciveArray[22]=0;//IOA iec104ReciveArray[23]=iecData[25];//value [DATA 2] iec104ReciveArray[24]=iecData[26];//value [DATA 2] iec104ReciveArray[25]=iecData[27];//value [DATA 2] iec104ReciveArray[26]=iecData[28];//value [DATA 2] iec104ReciveArray[27]=iecData[29];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); txcnt=txcnt; break; case 67: //TESTFR iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=iec104ReciveArray[1]; iec104ReciveArray[2] =131; //TESTFR con iec104ReciveArray[3] =0; iec104ReciveArray[4] =0; iec104ReciveArray[5] =0; MessageLength = iec104ReciveArray[1]+2; delay(10); client.write(iec104ReciveArray, MessageLength); iec104ReciveArray[0]=iec104ReciveArray[0]; iec104ReciveArray[1]=26;// APDU iec104ReciveArray[2]=lowByte(txcnt); iec104ReciveArray[3]=highByte(txcnt); iec104ReciveArray[4]=lowByte(rxcnt); iec104ReciveArray[5]=highByte(rxcnt); iec104ReciveArray[6]=13;//type 13 iec104ReciveArray[7]=02;//sq iec104ReciveArray[8]=03;//spont iec104ReciveArray[9]=00;//AO iec104ReciveArray[10]=01;//Adress iec104ReciveArray[11]=00;//Adress iec104ReciveArray[12]=iecData[16];//IOA iec104ReciveArray[13]=iecData[17];//IOA iec104ReciveArray[14]=0; iec104ReciveArray[15]=iecData[18];//value [DATA 1] iec104ReciveArray[16]=iecData[19];//value [DATA 1] iec104ReciveArray[17]=iecData[20];//value [DATA 1] iec104ReciveArray[18]=iecData[21];//value [DATA 1] iec104ReciveArray[19]=iecData[22];//IOA QDS iec104ReciveArray[20]=iecData[23];//IOA iec104ReciveArray[21]=iecData[24];//IOA iec104ReciveArray[22]=0;//IOA iec104ReciveArray[23]=iecData[25]; iec104ReciveArray[24]=iecData[26]; iec104ReciveArray[25]=iecData[27]; iec104ReciveArray[26]=iecData[28]; iec104ReciveArray[27]=iecData[29];//IOA QDS MessageLength = iec104ReciveArray[1]+2; client.write(iec104ReciveArray, MessageLength); break; } } }
Wiresharkã«ã¹ã±ãããããŒãããåŸãããŒã¿è»¢éãæçµçã«éå§ãããããšã確èªããŸãã
以äžã¯ãASDU <100> M_SP_NA_1ã·ã³ã°ã«ãã³è¡šç€ºã®æ§é ã®èª¬æã§ãã
TypeId-æ å ±ã®ã¿ã€ãã
SQ-å€æ°æ§é ã®åé¡åã
2ã€ã®ããŒã¿ãããã¯æ§é ãæ³å®ãããŸã
ã1. iåã®æ å ±ãªããžã§ã¯ããå«ããããã¯ãåãªããžã§ã¯ãã«ã¯1ã€ã®æ å ±èŠçŽ ïŒãŸãã¯èŠçŽ ã®1ã€ã®çµã¿åããïŒãå«ãŸããŸããå€æ°æ§é SQïŒåäž/ã·ãŒã±ã³ã¹ïŒã®åé¡åã®æäžäœãããã¯0ã§ãæ®ãã®7ãããã¯æ°å€iãæå®ããŸãã
2. jåã®èŠçŽ ãŸãã¯æ å ±èŠçŽ ã®åãçµã¿åãããå«ã1ã€ã®æ å ±ãªããžã§ã¯ããå«ããããã¯ã SQ修食åã®æäžäœãããïŒ27 = 80hïŒã¯1ã§ãæ®ãã®7ãããã¯æ°å€jãæå®ããŸãã
åç
CauseTx-転éã®çç±ã
åç
Addr-ã¹ã¬ãŒãã®ã¢ãã¬ã¹ïŒãŠã£ã¶ãŒãã®æ§ææã«æå®ïŒã
IOA㯠-ãã®ã¢ãã¬ã¹ç£èŠã¹ããŒã·ã§ã³ã§ã®ãªããžã§ã¯ãæ å ±ã®ã¢ãã¬ã¹ã¯ãããªãã®ã¿ã°ãã¯ã¿ã€ãŸã
SIQéä¿¡ãããä¿¡å·ã®å質ã- ã
æ©èœãããã¯<11> M_ME_NB_1ã®ASDUæ§é ïŒ
Wireshark
åä¿¡ããããŒã¿ã«å¿ããŠããã¹ã¿ãŒã¯Sãã©ãŒããããããã¯ãéä¿¡ããããã»ã¹ã¯ç£èŠå¯Ÿè±¡ïŒã¹ã¬ãŒãïŒããã€ã¹ããã¬ãŒã ã®éä¿¡ãåæ¢ãããŸã§ã«ãŒãããŸãã
5.ãã¹ãæé
ãã¹ãæé ã¯ããã©ã³ã¹ããŒãæ¥ç¶ã®ç¶æ ãç£èŠããããã«äœ¿çšãããŸããå¶åŸ¡æét3ã®éã«ãã¬ãŒã ïŒIãUãSïŒãåä¿¡ãããªãã£ãå ŽåãIPæ¥ç¶ã®ãã¢ã¯ãã£ããã£ãã«é¢ä¿ãªãæé ãå®è¡ãããŸããæét3ã¯æ¿èªã®å¯Ÿè±¡ã§ããããé·æéã®ããŠã³ã¿ã€ã ãçºçããå Žåã®ãã¹ããããã¯ã®éä¿¡ã®ã¿ã€ã ã¢ãŠãããšåŒã°ããŸãããã¹ãæé ã¯ããã¹ãAPDUãéä¿¡ããããšã§å®è£ ããïŒTESTFR = actïŒãAPDUã䜿çšããŠåä¿¡ã¹ããŒã·ã§ã³ã§ç¢ºèªãããŸãïŒTESTFR = conïŒã
åç
Wireshark
APDUã¿ã€ãã®ãã€ãã®å€ã60ãããã¯ãŒã¯ïŒTESTFRïŒã«çããå¶åŸ¡ïŒãã¹ã¿ãŒïŒã¹ããŒã·ã§ã³ããAPDUãå°çããå Žåãããã¯æét3ïŒIãUãSïŒã®éã«å¶åŸ¡ã¹ããŒã·ã§ã³ãããã¬ãŒã ãåä¿¡ãããªãã£ãããšã瀺ããŸããããã³æét1ã®éã«ç¢ºèªã§å¿çããªãå Žåãæ¥ç¶ã¯åæãããŸãã
ã¹ã±ãã
case 67: iec104ReciveArray[0]=iec104ReciveArray[0];// , START2 = 68h; iec104ReciveArray[1]=iec104ReciveArray[1];// APDU LENGHT iec104ReciveArray[2] = 131; //TESTDT con iec104ReciveArray[3] =0; iec104ReciveArray[4] =0; iec104ReciveArray[5] =0; MessageLength = iec104ReciveArray[1]+2;// + 2 Start68H and Lenght delay(10); client.write(iec104ReciveArray, MessageLength);
Wireshark
誰ããèå³ãæã£ãŠããã®ã§ããã°ãããã§ãã¹ãŠã§ãã次ã®èšäºã§ã¯ãäŸãšããŠArduinoã䜿çšããŠããã¹ã¿ãŒã¹ããŒã·ã§ã³ããã®IEC 670-5-104ãããã³ã«ãæ€èšããŸãã