TCP/IP 네트워크를 통해 PLC와 통신하여 장치 값을 가져오고 쓰는 방법
프로비저닝
실제 사용되는 기기는 미쓰비시모터FX5U의 중소형 장비를 대상으로 한 PLC로, LAN의 입구는 표준장비의 유형이다.
이런 유형의 PLC는 IP 주소를 설정할 수 있고 소켓으로 통신할 수 있기 때문에 프로그래밍 언어를 선택하지 않고 상급 PC에서 PLC의 장치 값을 간단하게 읽을 수 있다.이번에는 Java로 샘플을 씁니다.
주제 밖의 말을 하자면, 내가 말한 생산 기술 현장의 사람(기계점)은 컴퓨터를 상위 PC라고 부른다.위에 설 생각은 없지만 현장에서 통과할 수 있기 때문에 아래 프로그램 설계사를 상위 PC라고 부른다.
프로그래밍 언어:Java
PLC: 미쓰비시 모터 FX5U
PLC용 관리 어플리케이션: 미쓰비시 모터 GX 워크스3
필요한 조작 매뉴얼: 미쓰비시 모터 홈페이지에서 다운로드↓
1. FX5 사용자 안내서(Ethernet 통신 편)
2. FX5 사용자 안내서(SLMP 편)
※ 가입자 등록 필요
PLC 측면 설정
전제적으로 PLC 측에서 IP 주소 설정 및 통신 포트를 열어야 합니다.
그 방법은:
미쓰비시 모터의 전용 소프트웨어인 GX 워크스3에서는 설정을 PLC에 보낸다.
GX 워크스3의 자세한 사용법은 생략되지만, PLC와의 연결 열기 매개변수→FX5UCPU→이더넷 구성으로 SLMP 연결기기가 추가된다.
SLMP는 미쓰비시 모터 PLC의 TCP/IP 통신 프로토콜 이름입니다.
추가 후 포트 번호를 할당합니다.주의해야 할 것은 동시에 통신할 수 있는 것은 1포트 1상급 PC이며, 여러 상급 PC의 통신이 있으면 SLMP 연결 장치를 늘려 다른 포트를 분배해야 한다는 것이다.
SLMP 연결 장치를 추가하여 포트를 결정한 후에 적용할 수 있으며 설정을 PLC로 보낸 후 PLC측에서 끝냅니다.
참고로 같은 네트워크 세그먼트에서 시작하지 않으면 PLC와 GX Works3의 통신이 불가능하니 주의하세요.나는 이것이 설비의 무단 변경을 방지하기 위한 제약이라고 생각한다.설정 시 다른 세션을 통해 통신할 수 있습니다.
그리고 FX5 이전 타입의 CPU GX Developer나 GX Works2 이전 버전보다 전용 소프트웨어로 바뀌었다.최초 현장에서 받은 소프트웨어는 GX 디벨로퍼로 통신이 불가능했고, GX 디벨로퍼→워크스2→워크스3 버전을 높여 드디어 통신이 가능해졌다.
자세한 내용은 매뉴얼'FX5 사용자 매뉴얼(Ethernet 통신 편)'의 SLMP 기능장을 참조하십시오.
상대방 기계연결 구성설정<상세설정>을 클릭
이 화면에는 3개의 포트, 102521026, 1027이 추가됐다.
추가 시 오른쪽 이더넷 디바이스 일람표에서 SLMP 연결기기를 선택하면 추가가 가능하다.
Java로 플러그인 설계
PLC 측이 SLMP 프로토콜을 통해 통신 설정을 할 수 있다면 향후 프로그래밍을 준비할 예정이다.
이번엔 Java로 샘플링 설명을 하는데 C#, 루비, 소켓이면 뭐든지 돼요.
이번에 쓰면 이 정도야.특별히 어려운 것은 없다.
Soc.java
Socket s = new Socket("192.168.1.2", 1025);
BufferedInputStream in = new BufferedInputStream(s.getInputStream());
OutputStream os = s.getOutputStream();
//SLMP伝文送る
os.write(xxxxxx);
os.flush();
//返事受け取る
byte[] tmp = new byte[100]; //返事は短いので100もあればOK
int len = in.read(tmp);
System.out.println(tmp); //整形して出力
os.close();
in.close();
s.close();
SLMP 메시지 쓰기
가장 번거로운 것은'xxxxx'가 교부한 SLMP 전송문을 SLPM 형식으로 이진 데이터를 만드는 것이다. 이것은 매뉴얼'FX5 사용자 매뉴얼(SLMP 편)'만 보면 OK된다.그러나 수첩은 여러 항목이 관련되어 있기 때문에 어디를 읽어야 할지 정리했다.그나저나 SLPM 형식에도 ASCII 형식이 있는데 PLC 측에서 2진법(기본값)으로 설정했기 때문에 2진법이다.
예를 들어 D3 값을 읽을 때 전송문
성부
기장
값(16진수 문자열)
생각
하위 제목
2바이트
5000
매뉴얼의 수치는 16진수로 0050이지만 Low-Hight 순으로 보내기 때문에 저위 1바이트, 상위 1바이트 순으로 교부한다.
요청 네트워크 번호
1바이트
00
FX5U에서 00으로 고정됩니다.매뉴얼, 청구자 네트워크 번호, 청구자 사이트 번호를 참조하는 항목
요청자 사이트 번호
1바이트
FF
FX5U의 경우 00 고정 FF 고정동일 참조 설명서
요청 장치 입출력 번호
2바이트
FF03
설명서 참조, 사이트 값은 03FF입니다.Low-Hight 순으로 보내기 때문에 낮은 바이트부터 정렬합니다.
다중 지점 번호 요청
1바이트
00
많이 넣지 않기 때문에 00으로 고정합니다.
요청 데이터 길이
2바이트
0C00
보존 + 명령 + 하위 명령 + 요청된 데이터의 총 바이트입니다.워드 장치 D로부터 읽기 명령을 보내기 때문에 이번 바이트의 길이는 12바이트입니다.낮은 바이트부터 배열하기 때문에 000C는 0C00입니다.
보류
2바이트
0000
단어 장치에서 1자 단위로 읽을 때 0000입니다.매뉴얼의 명령을 참조하여 일람한 항목.
명령하다
2바이트
0104
매뉴얼의 명령을 참조하여 한 번에 0401로 읽으면낮은 바이트부터 0x0104를 배열하기 때문이다.
하위 명령
2바이트
0000
읽기 장치의 데이터 크기에 따라 설정합니다.D면, 워드 장치의 메모리 확장이 없기 때문에 0000입니다.매뉴얼의 하위 명령을 참조하여 일람한 항목.
데이터 요청
명령에 따르다
030000A80100
D3을 읽으려면 시작 장치 번호(3바이트의 양은 3번) + 장치 코드(1바이트의 A8) + 장치 포인트(2바이트의 1점)가 이번에는 000003+ A8+0001이다.이것들은 각각 저위 바이트부터 배열된다.
SLMP 매뉴얼에는 TCP/IP의 헤더라고 쓰여 있어 아무것도 하지 않아도 된다.응용 프로그램 헤더의 일부분을 매립합니다.
설명은 고정된 길이의 바이트로 구성되어 있으며 시작부터 헤더(2바이트), 요청 목표 네트워크 번호(1바이트), 요청 목표 사이트 번호(1바이트) 등 너비가 결정됩니다.각각 수치를 입력해야 하며, 설정해야 할 값은 매뉴얼을 참조한다.
요청자 사이트 번호와 유닛 I/O 번호 등은 PLC가 유닛 단위로 부자관계를 통해 PLC를 연결할 수 있기 때문에 현장에서 어떤 구성이 이루어졌는지 알려주셔야 합니다. 이번에는 FX5U 단일체의 상황입니다.
번거로운 것은 PLC에 보낼 때 2바이트 이상의 값집합을 낮은 바이트에서 납품하고, 값이 000C라면 납품할 때 0C00을 쓴다.하지만 익숙해지면 간단해진다.
장치 코드는 설명서의 장치 범위 페이지에 있습니다.
위에서 설명한 대로 D3 장치의 요청 전송 파일 읽기
Soc.java
String snd = "5000" //サブヘッダ
+ "00" //要求先ネットワーク番号
+ "FF" //要求先局番
+ "FF03" //要求先ユニットI/O番号
+ "00" //要求先マルチドロップ局番
+ "0C00" //要求データ長(リザーブ以降のバイト長)
+ "0000" //リザーブ
+ "0104" //コマンド 0401=一括読出し
+ "0000" //サブコマンド 0000=ワードデバイスから1ワード単位でデータを読み出し
+ "030000" //先頭デバイス番号 3
+ "A8" //デバイスコード D
+ "0100"; //デバイス点数 1
//文字列からバイナリに変換
//Javaのbyteは符号付きなので例えばFFは255ではなく-1
//でもビットの並びは11111111なので気にしなくてよさそう
byte[] bi = javax.xml.bind.DatatypeConverter.parseHexBinary(snd);
.대답을 받아들이다
이것을 PLC에 던져라. 이번 응답문은 2진법으로 해석할 것이다.형식은 SLMP 프로토콜 매뉴얼을 읽으면 OK라는 뜻의 고정 길이 형식이다. 매우 간단하다.
이번 D3를 읽으려면 바이트 길이로 13바이트 정도의 데이터를 얻을 수 있다.오류가 발생한 경우 오류 정보 부분을 약 20바이트 포함합니다.D3의 값이 31이면 16진수 문자열로 표시됩니다.
D00000FFFF0300060000001F00
처음부터 7바이트까지는 사이트 번호 정보이기 때문에 이번에는 무시할 수 있다. 8, 9바이트는 응답 데이터 길이다.10, 11 바이트는 끝 코드입니다.12바이트 이후는 응답 데이터입니다.따라서 종료 코드가 0000인 것을 확인하고 읽은 바이트는 OK입니다.이 때도 하위 바이트, 상위 바이트 순서에 따라 응답 데이터 1F00은 001F이다.
기호 byte가 없으면 int로 변환하면 D3 값을 얻을 수 있습니다.
intval=(12바이트) <<<8) + Byte.tounignedInt(11바이트);
※ 위 부분은 다음과 같이 수정↓
D 장치는 -32768에서 32767까지의 값 범위 내에서 기호이기 때문에 int로 확장하여 위치 이동 연산을 합니다.D3 = -30이면 FFE2 및 기호가 있는 값이 반환됩니다.
int val=((int)res[12바이트])<<<8)|(int)res[11바이트]);
총결산
하면, 만약, 만약...
Soc.java
import java.net.*;
import java.io.*;
import javax.xml.bind.*;
public class Soc {
public static void main(String[] args) throws Exception {
Socket so = null;
OutputStream out = null;
BufferedInputStream in = null;
try {
so = new Socket("192.168.1.2", 1025);
in = new BufferedInputStream(so.getInputStream());
//要求伝文
//Javaバイトは符号付きなので例えばFFは255ではなく-1
//でもビットの並びは11111111なので気にしなくてよさそう
byte[] snd = DatatypeConverter.parseHexBinary(
"5000" //サブヘッダ
+ "00" //要求先ネットワーク番号
+ "FF" //要求先局番
+ "FF03" //要求先ユニットI/O番号
+ "00" //要求先マルチドロップ局番
+ "0C00" //要求データ長(リザーブ以降のバイト長)
+ "0000" //リザーブ
+ "0104" //コマンド 0401=一括読出し
+ "0000" //サブコマンド 0000=ワードデバイスから1ワード単位でデータを読み出し
+ "030000" //先頭デバイス番号 3
+ "A8" //デバイスコード D
+ "0100"); //デバイス点数 1
out = so.getOutputStream();
out.write(snd);
out.flush();
//応答受取
byte[] res = new byte[20]; //長さは20バイトで丁度
int len = in.read(res);
//ここでresの中身はD3=31なら
//D00000FFFF0300060000001F0000000000000000
//終了コードチェック Low-Highの順なので8ビットシフト
int rescode = (((int)res[10])<<8) | ((int)res[9]);
if(rescode != 0)
throw new Exception("ERROR: " + rescode);
//エラーがなければ値を読む。応答データのうち
//デバイス点数1でワードデバイスとわかっているのでズバリ特定の場所を読む
int val = (((int)res[12])<<8) | ((int)res[11]);
System.out.println("D3=" + val);
}
finally {
if(out != null) try { out.close(); } catch(Exception e){}
if(in != null) try { in.close(); } catch(Exception e){}
if(so != null) try { so.close(); } catch(Exception e){}
}
}
}
실행 결과bash-3.2$ java Soc D3=31
이렇게 하면 PLC의 상태를 상위 PC에서 볼 수 있습니다.
명령을 쓰는 것도 이 요령이다. 예를 들어 M01에 위치를 정하면 상급 PC에서 PLC를 조작하는 일도 간단하다.
보안 설정 설정을 PLC로 설정할 필요가 있지만 여기까지입니다.
Reference
이 문제에 관하여(TCP/IP 네트워크를 통해 PLC와 통신하여 장치 값을 가져오고 쓰는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/hidehito108/items/e8eca75a46ee7d59feed텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)