액션
액션 편집기입니다. 신원과 위치, 스크립트 묶음, 스크립트가 읽고 쓸 수 있는 것, 모든 검사 메시지, 실행 동사와 그 기록, 사용과 사용 안 함, 복사와 삭제, 그리고 실행 한도.
액션은 주소 공간을 읽고 내부 값 변수와 태그에 쓰는 JavaScript 실행문 묶음입니다. 액션은 Logic이 값을 쓰는 길입니다. 요청할 때(실행), 트리거로, 또는 그것에 이어진 대시보드 버튼으로 돕니다. Logic 열의 Actions 구역 아래에서 액션을 고르면(또는 새로 만들기… > 새 액션으로 만들면) 그 편집기가 열립니다. 읽는 데에는 Logic 보기, 편집하는 데에는 Logic 구성, 실행하는 데에는 Logic 조작이 필요합니다.
머리글은 액션 표시와 이름, 그리고 "직접 실행하거나 트리거가 대신 실행하는 스크립트이며, 변수와 태그에 값을 씁니다."라는 줄을 보여 주고, 액션이 꺼져 있는 동안에는 사용 안 함 필을 함께 보여 줍니다. 양식 열에는 식별과 스크립트가 놓이고, 난간에는 마지막 실행이 놓입니다.
식별
| 칸 | 무엇인가 | 값과 기본값 | 효과 |
|---|---|---|---|
| 이름 | 표시 이름이자 실행이 기록될 때 붙는 이름표. | 자유 입력. 새 액션은 ActionN이고, 빈 이름은 Action으로 저장됩니다. |
자판을 누를 때마다 자동으로 저장됩니다. 액션은 신원으로 참조되므로 이름을 바꿔도 아무것도 고쳐 쓰이지 않고 아무것도 깨지지 않습니다. |
| 위치 줄 | 액션이 놓인 자리를 말로 적은 것입니다. Actions / Startup / Walk setpoint입니다. |
읽기 전용. | 액션에는 주소가 없습니다. 이 줄은 자리일 뿐이며 결코 수식에 입력할 것이 아닙니다. 트리의 이동 위치로 바꾸십시오. |
| 설명 (선택) | 자유 입력. | 기본값은 비어 있습니다. | 없습니다. |
스크립트
스크립트 카드는 스크립트 편집기이며 안내는 이렇습니다. "JavaScript 실행문입니다(let, if, for, 함수). 내부 값 변수는 대입으로 쓰고(Variables.Setpoint = 21.5;), 태그는 Connector.Driver.Device.Tag.Write(value)로 씁니다. 읽기는 품질을 걸러 주지 않으므로, 계산하기 전에 .State()를 확인하고 ??로 빈 값을 막으십시오." 스크립트는 자판을 누를 때마다 저장되고 0.5초마다 검사되며, 메시지는 안내 아래에 나타납니다. 검사는 결코 스크립트를 실행하지 않습니다.
스크립트는 수식과 같은 주소 공간과 같은 읽기 표면 위에서 도는 평범한 엄격 모드 JavaScript입니다(지역 변수, if, 반복문, 함수, Math, Date, JSON). 다른 점은 둘입니다. 읽기는 품질을 걸러 주지 않습니다. 빈 값은 null로 읽히므로 .State()를 확인하고 계산은 ??로 막으십시오. 나쁜 읽기를 다루는 것이 바로 액션이 있는 이유입니다. 그리고 스크립트는 수식 변수를 읽을 수 있습니다(그것이 공개한 값입니다). 그것을 참조할 수 없는 것은 수식뿐입니다.
액션이 쓸 수 있는 것
현장을 바꾸는 구문은 정확히 둘이며, 둘 다 기록되는 쓰기 깔때기를 지나갑니다.
| 쓰기 | 형태 | 대상 |
|---|---|---|
| 내부 값 대입 | Variables.Setpoint = 21.5; 또는 Variables.Forno.Setpoint = 21.5; |
폴더 단계를 포함한 내부 값 변수입니다. 값은 변수의 출력 형식으로 맞춰지고, 유지 변수라면 저장 대상으로 표시됩니다. |
| 태그 쓰기 | Connector.Simulated.Pump.Cmd.Write(true); |
실시간 태그입니다. 값은 공학값이며, 태그의 변환 경로를 거꾸로 지나 장치가 받는 원시값이 됩니다. |
쓰기는 하나씩 곧바로 적용됩니다. 실패 전에 적용된 것은 적용된 채로 남고, 진단 로그는 각 쓰기를 출처 액션 아래에 옛 값에서 새 값으로 보여 줍니다. 실패한 쓰기는 예외를 던져 그 실행을 중단시키고, 이유는 그 결과에 담깁니다.
- "'X'에 쓰기가 거부되었습니다. 값이 유한하지 않습니다."(NaN이거나 무한)
- "'Tag'은(는) 커넥터에 올라와 있지 않습니다."(꺼진 장치이거나, 내장 서버가 담고 있지 않은 태그)
- "'value'을(를) 'Tag'에 맞게 변환하지 못했습니다."
- "'X'은(는) '
<holder>'이(가) 쓰기를 막고 있습니다."(도는 레시피나 인터록이 그 신호원을 잡고 있습니다) - "'Tag'에 쓰지 못했습니다. 서버가 실행 중입니까?"
- "변수 'X'을(를) 찾지 못했습니다."와 "'Variables.X'은(는) 수식 변수입니다. 계산되는 값이며 쓰지 않습니다."
검사가 거부하는 것
| 메시지 | 원인 |
|---|---|
| 스크립트가 필요합니다. | 편집기가 비어 있습니다. |
| 스크립트 오류: … | 글자가 해석되지 않습니다. |
| 주소는 고정이어야 합니다. 'Root'을(를) 계산된 구획으로 접근했습니다. | Variables[name]이거나 리터럴이 아닌 마디입니다. |
| 주소 '…'이(가) 완전하지 않습니다. | 포인트를 부르기에 너무 짧은 참조입니다. |
| 'X'을(를) 찾지 못했습니다. | 읽기나 대입 대상이 아무것도 가리키지 못합니다. |
| 변수 자체에 대입하십시오: Variables.Name = value. | =의 왼쪽이 멤버를 부르거나, 변수의 주소가 갈 수 있는 것보다 깊이 들어갑니다. |
| 'X'은(는) 수식 변수입니다. 계산되는 값이며 쓰지 않습니다. | 수식 변수에 대입합니다. |
| 'Connector' 포인트는 읽기 전용입니다. 태그는 Connector.Driver.Device.Tag.Write(value)로 쓰십시오. | Variables가 아닌 뿌리에 대입합니다(Process에는 자기 메시지가 있습니다). |
| 액션에서 Process 포인트는 읽기 전용입니다. 실행 명령과 준비 쓰기는 스크립트에서 지원하지 않습니다. | Process 포인트에 대입하거나 그 위에서 Write를 부릅니다. |
| Process 실행 명령은 액션에서 호출할 수 없습니다. 명령 포인트는 준비 상태를 읽기 전용으로 내보냅니다. | Process.<Model>.<Unit>.Commands.Start()나 그 밖의 명령 포인트를 부릅니다. Commands 포인트는 지금 그 명령을 실행할 수 있는지만 읽습니다. |
| 포인트에는 ++와 -- 연산자를 쓸 수 없습니다. Variables.Name = Variables.Name.ValueToReal() + 1처럼 쓰십시오. | Variables.N++입니다. |
| Write(value)가 태그 쓰기입니다: Connector.Driver.Device.Tag.Write(value). | 태그 주소가 아닌 것 위에서 Write를 불렀습니다. |
JavaScript 지역 변수(let x = 1; x = x + 1;)는 이 규칙과 무관합니다.
실행
실행은 열려 있는 액션 위 모음의 첫 동사입니다. Logic 조작을 가진 역할에게만 그려지고, 스테이션이 읽기 전용인 동안 "런타임 정지"와 함께 회색이 됩니다(엔지니어링 잠금은 이것을 회색으로 만들지 않습니다. 실행하는 것은 운전이지 구성이 아니기 때문입니다). 역할이 Logic 구성도 가졌다면 편집기의 초안이 먼저 저장되고 저장된 정의가 실행됩니다. 그것이 없으면 저장되어 있는 정의가 실행됩니다(칸이 읽기 전용이므로 둘이 다를 일은 없습니다).
모든 실행은 하나뿐인 로직 대기열에서 새 스크립트 엔진으로 돌아가므로, 실행과 실행 사이에 상태가 새지 않고 실행이 주기나 다른 액션이나 운전자의 쓰기 사이에 끼어들지 않습니다. 실행은 500 ms("스크립트를 중단했습니다: 500 ms 시간 한도를 넘겼습니다(무한 반복일 수 있습니다).")나 실행문 100,000개나 메모리 4 MB를 넘기면 중단되며, 저마다 어느 한도인지 밝히는 메시지를 남깁니다. 꺼진 액션은 돌지 않고 실패하고("이 액션은 사용 안 함으로 되어 있습니다."), 정지된 런타임은 "로직 런타임이 실행되고 있지 않습니다."라고 답합니다. 작업 기록 줄은 "12 ms 만에 정상으로 실행했습니다." 또는 "실행에 실패했습니다: <reason>"이라고 알립니다. Events 콘솔에는 실패만 올라가며, 액션의 이름과 함께 무엇이 그것을 불렀는지가 놓입니다. 동사로 실행했으면 수동, 일정으로 돌았으면 그 트리거의 이름입니다. 처음에는 경고로 기록되고, 같은 원인으로 계속 실패하는 동안에는 요약되며, 회복될 때 한 번 더 적힙니다. 그 회복 줄이 성공한 실행이 그곳에 남기는 유일한 항목입니다. 그냥 성공한 실행과 그것이 쓴 모든 값은 상세 수집에만 적힙니다. 주기마다 쓰는 스크립트는 값을 수천 개씩 만들어 내고, 그것으로 가득 찬 콘솔은 스테이션의 소식을 읽을 수 없는 콘솔이기 때문입니다.
마지막 실행 난간은 액션이 마지막으로 돈 때(또는 "실행한 적이 없습니다.")와 "걸린 시간: N ms"와 주의 알림에 담긴 마지막 오류를 보여 주고, 이렇게 일깨웁니다. "실행은 로직 큐 하나에서 처리됩니다. 이벤트 콘솔에는 실패한 실행만 올라가고, 성공한 실행과 그 실행이 쓴 값은 상세 기록으로 남습니다. 트리거는 일정에 따라 액션을 부릅니다." 이 난간은 살아 있는 액션의 것입니다. 자동 저장은 그것을 비우지 않지만, 런타임을 다시 시작하면 비워집니다.
명령
| 명령 | 하는 일 | 회색이 되는 때 | 그려지지 않는 때 |
|---|---|---|---|
| 실행 | 초안을 저장하고(Logic 구성이 있을 때) 실행 하나를 대기열에 올립니다. | 런타임 정지. | 역할에 Logic 조작이 없을 때. |
| 사용 / 사용 안 함 | 사용 표시를 뒤집습니다. 꺼진 액션은 실행을 거부하고, 그것에 이어진 모든 트리거를 쉬게 합니다. | 스테이션이 잠겼거나 읽기 전용일 때. | 역할에 Logic 구성이 없을 때. |
| 복사 | 액션을 Actions 뿌리로 비어 있는 이름으로 복제하고 복사본을 엽니다. 복사본에는 실행 기록도, 이어진 트리거도 없습니다. | 스테이션이 잠겼거나 읽기 전용일 때. | 역할에 Logic 구성이 없을 때. |
| 액션 삭제 | "'X'을(를) 삭제하시겠습니까? 이 액션이 없어집니다. 이 작업은 되돌릴 수 없습니다."라고 묻습니다. 그것에 이어져 있던 트리거는 삭제되지 않고 이어짐이 풀린 채로 남습니다. | 스테이션이 잠겼거나 읽기 전용일 때. | 역할에 Logic 구성이 없을 때. |
Actions 뿌리 패널은 모든 액션을 값 열의 상태와 함께 나열합니다. "사용 · 마지막 실행 <when>"이며, 마지막 실행이 실패했으면 "· 오류"가 붙고, 꺼져 있으면 "사용 안 함"입니다.
액션이 하지 않는 일
액션은 Process 실행 명령을 보내지 않고, 절차를 준비하지 않으며, 실행에 코멘트를 더하지 않습니다(그 포인트는 읽기 전용인 준비 상태와 준비 값입니다). 경보를 확인하지 않습니다. 나란히 돌지 않습니다. 실행과 실행 사이에 상태를 남기지 않고 함수를 함께 쓰지도 않습니다. 그리고 값의 변화나 조건으로 발동하지 않으며, 오직 실행 동사와 트리거의 간격과 대시보드 버튼으로만 발동합니다.