산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 산업기술

파이썬에서 gRPC로 AXC F 3152 공정 데이터 읽기/쓰기

이 기사는 AXC F 3152에서 파이썬과 gRPC를 사용해 간단한 공정 데이터에 접근하고 쓰는 방법을 설명합니다. (https://www.plcnext.help/te/Service_Components/gRPC_Introduction.htm)

사전 준비

먼저 PLC 외부에서(예: 윈도우 머신) 필요한 파일들을 준비해야 합니다.

  1. 파이썬 3.9 설치 (3.10은 에러 유발 가능)
  2. .proto 파일에서 코드 생성을 위한 필수 파이썬 패키지 설치: pip install grpcio-tools==1.36.1
  3. .proto 파일 저장소 다운로드 및 압축 해제: https://github.com/PLCnext/gRPC

.proto 파일에서 _pb2.py 및 _pb2_grpc.py 생성

제공된 .proto 파일에서 필요한 파이썬 파일을 생성합니다. 후자는 다음 폴더에 있습니다: gRPC-master/protobuf.

gRPC-master 폴더에 파이썬 스크립트(예: generate_grpc.py)를 생성하고 다음 코드를 사용하세요. 이 스크립트는

  1. 필요한 파일을 생성해 gRPC-master/pxc_grpc에 배치
  2. 임포트 경로 조정
 import glob import os from pathlib import Path # create the output directory Path('pxc_grpc').mkdir(parents=True, exist_ok=True) grpc_command_base = 'python -m grpc_tools.protoc -I./protobuf --python_out=pxc_grpc --grpc_python_out=pxc_grpc ' import_paths = set() # generate the *_pb2.py and *_pb2_grpc.py files for filename in glob.iglob('./protobuf/**', recursive=True): if filename.endswith('.proto'): # store the import path path_parts = filename.split(os.sep) import_paths.add('.'.join(path_parts[1:-1])) grpc_command = ''.join([grpc_command_base, os.path.join('.', os.path.relpath(filename))]) stream = os.popen(grpc_command) output = stream.read() if output != '': print(''.join(['error/info for file ', os.path.relpath(filename), ' - ', output])) # get the python files in the base directory base_pys = set() for (dirpath, dirnames, filenames) in os.walk('./pxc_grpc'): for f in filenames: base_pys.add(f.split('.py')[0]) break # reformat the stored paths to adapt the import statements try: import_paths.remove('') except: pass import_paths = list(import_paths) import_paths.sort(key=len) import_paths.reverse() # adapt the imports for filename in glob.iglob('./pxc_grpc/**', recursive=True): if filename.endswith('.py'): new_lines = [] with open(filename, 'r') as file: lines = file.readlines() for line in lines: if line.startswith('from'): for import_path in import_paths: if import_path in line: line = line.replace(import_path, ''.join(['pxc_grpc.', import_path]), 1) break elif line.startswith('import'): parts = line.split() if parts[1] in base_pys: line = line.replace('import', 'from pxc_grpc import') new_lines.append(line) with open(filename, 'w') as file: file.write(''.join(new_lines)) 

셸을 열고 스크립트 실행: pyton generate_grpc.py

PLCnext 데모 프로젝트 생성

보여지는 프로젝트는 gRPC 인터페이스가 GDS와 어떻게 상호작용하는지만 시연합니다. 기존 프로젝트를 써도 무방합니다. 개별 프로젝트라면 다음 파이썬 스크립트의 포트 이름을 적절히 수정하세요, 예: Arp.Plc.Eclr/MainInstance.strInput.

파이썬에서 gRPC로 AXC F 3152 공정 데이터 읽기/쓰기

PLC 준비

파이썬 패키지 관리를 위해 pip 설치:

  1. AXC F 3152 컨트롤러를 인터넷에 연결.
  2. 명령 실행: curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
  3. 명령 실행: python3 get-pip.py

필수 패키지 설치: pip install grpcio protobuf==3.20.0

프로젝트 디렉터리(/opt/plcnext/projects/)에 'grpc_test' 폴더 생성.

생성된 파이썬 파일이 든 'pxc_grpc' 폴더를 'grpc_test'로 복사(예: WinSCP 사용).

'grpc_test' 폴더에 'grpc_test.py'라는 파이썬 스크립트 생성 후 다음 코드 삽입:

 import grpc from pxc_grpc.Plc.Gds.IDataAccessService_pb2 import IDataAccessServiceReadSingleRequest, \ IDataAccessServiceReadRequest, IDataAccessServiceWriteSingleRequest, IDataAccessServiceWriteRequest from pxc_grpc.Plc.Gds.IDataAccessService_pb2_grpc import IDataAccessServiceStub from pxc_grpc.Plc.Gds.WriteItem_pb2 import WriteItem def write_single_string(stub, port_name, value): single_write_request = IDataAccessServiceWriteSingleRequest() single_write_request.data.PortName = port_name single_write_request.data.Value.TypeCode = 19 single_write_request.data.Value.StringValue = value return stub.WriteSingle(single_write_request) def write_single_int(stub, port_name, value): single_write_request = IDataAccessServiceWriteSingleRequest() single_write_request.data.PortName = port_name single_write_request.data.Value.TypeCode = 6 single_write_request.data.Value.Int16Value = value return stub.WriteSingle(single_write_request) def write_multiple_values(stub): write_request = IDataAccessServiceWriteRequest() wi1 = WriteItem() wi1.PortName = 'Arp.Plc.Eclr/MainInstance.strInput' wi1.Value.StringValue = "test1" wi1.Value.TypeCode = 19 wi2 = WriteItem() wi2.PortName = 'Arp.Plc.Eclr/MainInstance.strInput2' wi2.Value.StringValue = "test2" wi2.Value.TypeCode = 19 # add multiple WriteItems at once write_request.data.extend([wi1, wi2]) # add WriteItems separately # response1.data.append(wi1) # response1.data.append(wi2) return stub.Write(write_request) def read_single_value(stub, port_name): single_read_request = IDataAccessServiceReadSingleRequest() single_read_request.portName=port_name return stub.ReadSingle(single_read_request) def read_multiple_values(stub, port_names): read_request = IDataAccessServiceReadRequest() read_request.portNames.extend(port_names) return stub.Read(read_request) if __name__ == "__main__": # create channel and stub channel = grpc.insecure_channel('unix:/run/plcnext/grpc.sock') stub = IDataAccessServiceStub(channel) print(write_single_string(stub, 'Arp.Plc.Eclr/MainInstance.strInput', 'test123')) print(write_single_int(stub, 'Arp.Plc.Eclr/MainInstance.iInput', 18)) print(write_multiple_values(stub)) r = read_single_value(stub, 'Arp.Plc.Eclr/MainInstance.strInput') print(r) print(r._ReturnValue.Value.TypeCode) print(r._ReturnValue.Value.StringValue) r = read_multiple_values(stub, ['Arp.Plc.Eclr/MainInstance.iInput', 'Arp.Plc.Eclr/MainInstance.strInput']) for value in r._ReturnValue: print(value, value.Value.TypeCode) 

PLC를 PLCnext Engineer에 연결, 프로젝트 다운로드, 라이브 뷰 시작.

예제 실행

이제 예제를 실행합니다. SSH로 PLC 로그인 후 'grpc_test'로 이동해 파이썬 스크립트 시작:

  1. cd projects/grpc_test/
  2. python3 grpc_test.py

gRPC는 GDS 변수와의 상호작용을 가능하게 합니다.

데이터 타입

변수 읽기/쓰기 시 데이터 타입 필요, 예: wi1.Value.TypeCode = 19. 타입은 생성된 파일 gRPC-master/pxc_grpc/ArpTypes_pb2.py 242번째 줄부터 설명:

CT_None = 0 CT_End = 0 CT_Void = 1 CT_Boolean = 2 CT_Char = 3 CT_Int8 = 4 CT_Uint8 = 5 CT_Int16 = 6 CT_Uint16 = 7 CT_Int32 = 8 CT_Uint32 = 9 CT_Int64 = 10 CT_Uint64 = 11 CT_Real32 = 12 CT_Real64 = 13 CT_Struct = 18 CT_String = 19 CT_Utf8String = 19 CT_Array = 20 CT_DateTime = 23 CT_Version = 24 CT_Guid = 25 CT_AnsiString = 26 CT_Object = 28 CT_Utf16String = 30 CT_Stream = 34 CT_Enumerator = 35 CT_SecureString = 36 CT_Enum = 37 CT_Dictionary = 38 CT_SecurityToken = 39 CT_Exception = 40 CT_IecTime = 41 CT_IecTime64 = 42 CT_IecDate = 43 CT_IecDate64 = 44 CT_IecDateTime = 45 CT_IecDateTime64 = 46 CT_IecTimeOfDay = 47 CT_IecTimeOfDay64 = 48 

해당 값 변수들(예: r._ReturnValue.Value.StringValue)은 같은 파일 365번째 줄부터 찾을 수 있습니다(예: BoolValue, Int8Value, StringValue).

산업기술

  1. Apacer, 글로벌 고성능 플래시 카드 CV110-SD & CV110-MSD 출시
  2. Apacer, 560MB/s 읽기·520MB/s 쓰기 SV250 산업용 SSD 출시
  3. 산업 운영에서 RTU 활용으로 빅데이터 통찰력 확보
  4. 밀링(Milling) 가공 완전 정복: 정의, 공정, 주요 작업 유형
  5. 드릴링(Drilling) 가공 완벽 가이드: 정의, 공정, 금속 드릴링 12가지 실전 팁
  6. 분말 야금(Powder Metallurgy) 완벽 가이드: 정의, 공정, 장단점, 응용
  7. 브로칭(Broaching) 공정 완벽 가이드: 원리, 종류, 장단점 및 기계 유형
  8. 화학 가공: 응력 없는 정밀 금속 제거 기술
  9. 초음파 가공: 작동 원리, 종류 및 주요 응용 분야
  10. 스프레이 용접 설명: 공정, 기술 및 안전