저번 포스팅에서 pyads로 twincat 연결하는 부분에 대해 설명했다
그럼 twincat은 어떻게 쓰나?
우당탕탕 일대기 시작..
우선 기본적으로 twincat은 VS를 사용한다. 그래서 사용할 버전에 맞게 설치하면 된다! 나는 2017을 사용했다. 버전은 구글링 잘 하면 나오니까.. 맞춰서 설치하시길.. 없다면 말씀하시고 보내드릴테니
그리고 일하면서 느낀건데 설치파일은 따로 usb에 백업해놓는게 좋더라구요 다른 사람 설치해줄때도 편하고요
저는 python, java, mobaxterm, Visual studio, openssl, twincat 등등 설치파일을 따로 가지고 다닙니다!

twincat은 https://www.beckhoff.com/ko-kr/products/automation/twincat/ 링크에서 다운받을 수 있다. bulid 뒤에 숫자를 잘 보고 twincat pc와의 버전 정보가 일치하는 걸로 다운받으면 된다!
나는 4018이었다오..
그 후 연결시에 주의사항이 있는데.. 그건 좀 귀찮을 수 있다
설치 후 twincat > system 폴더 내에 win8settick를 실행 시켜주어야 한다!

그리고.. 뭐.. 해보면 된다 어려운 건 없으니

설치하고 나면 작업표시줄에 파란색 모니터가 보일 거다! 저게 twincat이고 저기서 실행도 가능하다!
설치 후 파란색 모니터를 우클릭 하고 Static Routes에서 Route를 Add 하여 PLC와 연결하는 과정이 필요하다. 이 과정에서 AmsNetId와 Address를 확인할 수 있다.

twincat을 실행하면 이제 저런 화면이 보이는데 유감스럽게도 현재 test할 plc가 안남아서.. 못하네요... 나중에 수정해서 올릴게요..
우선 확인해야할 건 현재 TEST-3이 (ERROR)로 잡혀있는데 이러면 안돼요..
연결을 계쏙 시도하고 좌측에 있는 초록색 파란색 버튼으로 comfile까지 마춰야 실행됩니다.
우선 프로젝트를 생성합니다!
그러면 안에 다양한 내용이 생기는데요!

위 처럼 DUTs, GVLs, POUs, VISUs 등이 있다
하나씩 살펴보면
DUTs = data unit types로 사용자 정의 데이터다.
GVLs = global Variable List로 글로별 변수들이다.
POUs = program organization unit으로 실행 main으로 생각하자.
VISIs = visualzation units으로 시각화 유닛들이 담겨있다.
ST 언어는 기본적으로 변수 선언에 =가 아닌 :를 사용한다.
ARRAY일 경우에는 : ARRAY[1..5] of INT로 설정하면 된다. 그럼 1~5까지의 크기로 INT로 저장된다.
내가 지정한 데이터를 보자면
{attribute 'pack_mode' := '1'}
TYPE ST_EL3443_Alarm :
STRUCT
Unbalance_rate : ST_DataInfo; // 전류 3상불평형률
Total_Basic_Frequency : ST_DataInfo; // 종합 주파수
Total_Basic_Powerfactor : ST_DataInfo; // 종합 역률
Basic_Voltage : ARRAY [1..3] OF ST_DataInfo; // 전압 Array[1] = CH1 ~ Array[3] = CH3
Basic_Current : ARRAY [1..3] OF ST_DataInfo; // 전류 Array[1] = CH1 ~ Array[3] = CH3
Power_Active_Power : ARRAY [1..3] OF ST_DataInfo; // 피상전력 VA
Power_Apparent_Power : ARRAY [1..3] OF ST_DataInfo; // 유효전력 W
Power_Reactive_Power : ARRAY [1..3] OF ST_DataInfo; // 무효전력 var
Power_Power_Factor : ARRAY [1..3] OF ST_DataInfo; // 역률
HarmonicU_180hz : ARRAY [1..3] OF ST_DataInfo; // 전압 3고조파 비율 %
HarmonicU_300hz : ARRAY [1..3] OF ST_DataInfo; // 전압 5고조파 비율 %
HarmonicI_180hz : ARRAY [1..3] OF ST_DataInfo; // 전류 3고조파 비율 %
HarmonicI_300hz : ARRAY [1..3] OF ST_DataInfo; // 전류 5고조파 비율 %
THD_U : ARRAY [1..3] OF ST_DataInfo; // 전압 왜곡률
THD_I : ARRAY [1..3] OF ST_DataInfo; // 전류 왜곡률
END_STRUCT
END_TYPE
위와 같다. 구조를 보자
최상단에는 TYPE이다. 그 아래 STRUCT 가 들어있고 변수가 선언되어있는 걸 볼 수 있따.
{attribute 'pack_mode' := '1'}
TYPE ST_Livo :
STRUCT
Timestamp : ULINT; // 시간분초미리세크 ex)173022456
Data : ARRAY[1..MaxModule] OF ST_EL3443_Data; // 모듈별 EL3443데이터
Alarm : ARRAY[1..MaxModule] OF ST_EL3443_Alarm; // 모듈별 EL344 평균데이터 알람
END_STRUCT
END_TYPE
global value를 설정하여 아래처럼 변수 내에 넣을 수도 있다.
다 알겠지만 해당 내용은 변수에 대한 값이 아닌 type과 정보를 넣는 과정이다.
{attribute 'qualified_only'}
VAR_GLOBAL
Bufferindex : INT := 1;
END_VAR
gvls도 선언 방식을 보면 VAR_GLOBAL 안에서 변수 매핑 하는 걸 볼 수 있고 값도 되어있는 걸 확인할 수 있다.
값을 매핑하는 방법은 간단하다. :=이다.
그렇다면 외부에서 호출할 떈?
그렇다 GVLS에 선언이 되어있어야 한다.
VAR_GLOBAL
Buffer1Trig : BOOL; // Buffer1Trigger 신호
Buffer2Trig : BOOL; // Buffer2Trigger 신호
Livo_Buffer1 : ARRAY [1..125] OF ST_Livo; // Buffer1 (1초 데이터)
Livo_Buffer2 : ARRAY [1..125] OF ST_Livo; // Buffer2 (1초 데이터)
Validation_Buffer1 : ARRAY[1..125] OF ST_TwinCATData; // Buffer1 (1초 데이터)
Validation_Buffer2 : ARRAY[1..125] OF ST_TwinCATData; // Buffer2 (1초 데이터)
END_VAR
그래서 위 처럼 선언할 수 있게끔 조정해야한다.
Main 내에서는
IF a > 10 THEN
b := b + 1;
ELSE
b := b - 1;
END_IF;
위와 같이 반복문, 조건문도 사용이 가능하고
FOR i := 1 TO 10 DO
// 반복 작업
END_FOR;
WHILE 조건 DO
// 조건이 참인 동안 실행
END_WHILE;
REPEAT
// 반복 작업
UNTIL 조건
END_REPEAT;
반복문도 쉽게 사용이 가능하다.
위 내용을 모두 컴파일하고 PLC에 다운로드 한 다음 Twincat runmode로 전환하여 실행하면 확인할 수 있다!
간단하다!
FUNCTION AddNumbers : INT
VAR_INPUT
num1 : INT;
num2 : INT;
END_VAR
AddNumbers := num1 + num2;
이렇게 함수를 선언할 수도 있으니 다행이다!
근데 힘든건 역시 연결...
연결과정에서 route에 x로 확인이 되었으나 프로젝트를 run mode로 돌릴 경우에 자꾸 연결 에러가 나는 걸 확인했다
원격으로 연결된 pc에서도 에러가 꾸준히 났고 그 결과는 참담했다. 무려 하루를 날려먹게 한..
raise ADSError(err_code)
pyads.pyads_ex.ADSError: ADSError: symbol not found (1808).
위 코드가 simbol not found로 나서 난 당연히 내가 뭔가 선언을 잘못했겠지 하는 생각이 있었따.
하지만 그 문제는 아니었고 내가 살펴본 건 총 2가지였다.
우선 router의 경우 정상 연결을 확인하기도 했고 초기화한 후 다시 연결도 시도해보았다.
계속 연결은 잘 되었지만 main을 실행시키면 simbole 오류가 발생했다.
하.. 이걸 어쩌지 하고 생각하다가 방화벽 이슈가 있을 수 있다 하여
방화벽의 인바운드와 아웃바운드 규칙 모드에 851포트를 설정해두었다.
또 502에 대한 규칙도 추가하여 방화벽 문제를 해결하려 했다.
이 두가지가 가장 메인으로 생각되었는데 해결되지 않았다..
그래서 원시적인 방법을 써봤다.
신기하게 원시적인 방법이 됐다....... 참 억울하다 이럴 땐...........
그래도 근본적인 문제를 확인하기 위해 몇가지 테스트를 해보았다.
나는 pyads 3.4.2 버전을 사용하는데 이때 권고하는 파이썬 버전은 3.7, 8, 9이다
https://pypi.org/project/pyads/3.4.2/
위 링크에서 확인이 가능하다.
또 windows와 linux에 설치되어 있어야하고 윈도우 10, 11에 대한 정보는 없었다.
그래서 backhoff pc에 설치되어 있는 TwinCAT을 업그레이드하여 재설치하였고, pyads는 3.3.9 버전으로 다운그레이드를 진행하였다.
위와 같은 방법으로 해당 simbol 에러는 해결되었다..
ㅠㅠㅠㅠㅠㅠㅠ너무 힘들었다 정말..