액션

액션 편집기입니다. 신원과 위치, 스크립트 묶음, 스크립트가 읽고 쓸 수 있는 것, 모든 검사 메시지, 실행 동사와 그 기록, 마지막 실행을 누가 호출했는지, 무엇이 액션을 실행하는지, 사용과 사용 안 함, 복사와 삭제, 그리고 실행 한도.

Markdown으로 보기

액션은 주소 공간을 읽고 내부 값 변수와 태그에 쓰는 JavaScript 실행문 묶음입니다. 액션은 Logic이 값을 쓰는 길입니다. 요청할 때(실행), 트리거로, 그것에 이어진 대시보드 버튼으로, 또는 Process 실행의 시작 시점이나 완료 시점에 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()를 확인하고 계산은 ??로 막으십시오. 나쁜 읽기를 다루는 것이 바로 액션이 있는 이유입니다. 그리고 스크립트는 수식 변수를 읽을 수 있습니다(그것이 공개한 값입니다). 그것을 참조할 수 없는 것은 수식뿐입니다.

실시간 포인트(태그, 변수, 경보, Process 채널)는 값이 아니라 포인트 자체이므로, 값은 멤버로 읽으십시오: if (Variables.Start.ValueToBool()), Variables.Level.ValueToReal() > 80, if (Alarms.High.IsActive). if, while, do, for, ?:의 조건, !, &&, ||의 피연산자, 비교나 산술(+=와 다른 복합 대입 포함)에 그대로 쓰면 항상 참으로 취급되거나 값을 전혀 읽지 않습니다. if (Variables.Start) { … }는 변수의 값과 상관없이 실행할 때마다 그 블록을 실행합니다. 검사는 이를 거부하고 대신 읽을 멤버를 댑니다(검사가 거부하는 것). 함수에 넘긴 포인트와 포인트의 멤버는 쓴 그대로 둡니다. 그대로 쓴 포인트에 대한 switch나 포인트를 대는 case(.Value로 읽습니다), ??의 왼쪽(.Value로 읽습니다), 템플릿 리터럴의 자리 ${…}(.ValueToString()으로 읽습니다)도 마찬가지입니다. 변수에 대한 복합 대입(Variables.Total += 1, -=, ||= 등)은 쓰기 전에 변수를 포인트로 읽으므로, 제대로 동작하는 단순 대입을 대며 거부됩니다: Variables.Total = Variables.Total.ValueToReal() + 1.

액션이 쓸 수 있는 것

현장을 바꾸는 구문은 정확히 둘이며, 둘 다 기록되는 쓰기 깔때기를 지나갑니다.

쓰기 형태 대상
내부 값 대입 Variables.Setpoint = 21.5; 또는 Variables.Forno.Setpoint = 21.5; 폴더 단계를 포함한 내부 값 변수입니다. 값은 변수의 출력 형식으로 맞춰지고, 유지 변수라면 저장 대상으로 표시됩니다. 곧바로 적용되므로 같은 스크립트의 다음 줄은 방금 쓴 것을 읽습니다.
태그 쓰기 Connector.Simulated.Pump.Cmd.Write(true); 또는 …Cmd.WriteAndWait(true); 실시간 태그입니다. 값은 공학값이며, 태그의 변환 경로를 거꾸로 지나 장치가 받는 원시값이 되고, 깔때기는 그것을 그 장치 자신의 전달 대기열로 넘깁니다. 그 장치에 보낼 값들은 거기에서 도착한 순서대로 하나씩 나갑니다.

태그에는 쓰기 동사가 둘 있고, 스크립트는 답이 필요한지 아닌지로 고릅니다.

동사 인수 빠뜨렸을 때 돌려주는 값 설비를 기다리는가
Write(value) 값입니다. 빠뜨릴 것이 없습니다. 없습니다. 아니요. 값을 장치의 대기열에 넘기고 다음 줄이 돕니다.
WriteAndWait(value, timeoutMs, continueOnFailure) 값, 그 값을 몇 밀리초 기다릴지, 그리고 실패했을 때 계속할지입니다. timeoutMs: 드라이버 자신의 기다리는 시간을 대신 씁니다. continueOnFailure: true입니다. 설비가 값을 받아들였을 때만 true이고, 대체된 값을 포함해 그 밖의 모든 경우에는 false입니다. 예. 받았다는 답이 오거나 기다리는 시간이 다할 때까지 기다립니다.

기다림은 액션 차선 위에서 일어나므로 느린 장치는 이 뒤에 선 액션만 붙들고, 쓰기를 거두어들이지도 않습니다. 제때 확인되지 않은 값도 여전히 가고 있으며, 도착하면 그 답이 기록됩니다. 답도 딱 그렇게 말합니다. "'Cmd'은(는) 2000 ms 안에 확인되지 않았습니다. 값은 아직 장비로 가는 중입니다." continueOnFailure를 빠뜨렸거나 true이면 동사는 false를 돌려주고 스크립트는 계속 갑니다. false이면 실행은 그 줄에서 끝나고 대상과 이유를 부릅니다.

어떤 쓰기도 스스로 스크립트를 중단시키지 않습니다. 무엇이 나가기 전에 거부된 쓰기든, 설비가 거절하거나 끝내 답하지 않은 쓰기든 그 쓰기 하나만 실패합니다. 스크립트의 나머지는 돌고, 실행은 쓰기가 실패한 채로 성공한 실행으로 끝납니다. 되돌리는 것도 없으므로 실패한 쓰기 전에 적용된 것은 적용된 채로 남고, 진단 로그는 각 쓰기를 출처 액션 아래에 옛 값에서 새 값으로 보여 줍니다. 거부가 적히는 이유는 이렇습니다.

  • "'X'에 쓰기가 거부되었습니다. 값이 유한하지 않습니다."(NaN이거나 무한)
  • "'태그'은(는) 커넥터에 올라와 있지 않습니다."(꺼진 장치이거나, Connector가 담고 있지 않은 태그)
  • "'값'을(를) '태그'에 맞게 변환하지 못했습니다."
  • "'X'은(는) '<holder>'이(가) 쓰기를 막고 있습니다."(도는 레시피나 인터록이 그 신호원을 잡고 있습니다)
  • "'Cmd'에 쓰지 않았습니다. 장치가 연결되어 있지 않습니다."(장치가 이미 내려가 있다고 알고 있으므로 그 장치에는 아무것도 줄 세우지 않습니다)
  • "'태그'에 쓰지 못했습니다. Connector가 실행 중이 아닙니다."
  • "변수 'X'을(를) 찾지 못했습니다."와 "'Variables.X'은(는) 수식 변수입니다. 계산되는 값이며 쓰지 않습니다."
  • 거부가 전선에서 왔을 때에는 설비나 그 드라이버가 답한 그대로, 그쪽의 말로 적힙니다.

같은 태그에 더 새로운 쓰기가 들어와 장치의 대기열에서 앞질러 간 값은 실패가 아닙니다. "'Cmd'은(는) 보내기 전에 더 새로운 값으로 대체되었습니다."가 실제로 일어난 일 그대로이고, 설비가 듣는 것은 더 새로운 값이며, 이것은 WriteAndWait 말고는 어디에도 알려지지 않습니다. WriteAndWait에게는 false를 답합니다. 나간 값이 이 값이 아니기 때문입니다.

실행을 정말로 끝내는 것은 이렇습니다. 스크립트 자신의 오류(구문 오류, 아무것도 가리키지 못하는 주소, 예외), 쓰기가 실패한 WriteAndWait(…, false), 그리고 실행의 한도입니다.

실행 자신이 어떤 실패를 알릴 수 있는지는 누가 기다렸는지에 달려 있습니다. 무엇이 나가기 전에 거부된 Write는 스크립트가 아직 도는 동안 거부되므로 실행이 그것을 세고 작업 기록 줄도 그렇게 말합니다. 설비가 나중에 거절한 Write는 실행이 끝나고 한참 뒤에 답을 받으므로, 그것을 담는 것은 액션의 이름 아래 Events 콘솔이지 실행이 아닙니다. WriteAndWait는 답을 기다렸으니 답이 어느 쪽이든 셉니다.

검사가 거부하는 것

메시지 원인
"스크립트가 필요합니다." 편집기가 비어 있습니다.
"스크립트 오류: …" 글자가 해석되지 않습니다.
"주소는 고정이어야 합니다. 'Root'을(를) 계산된 구획으로 접근했습니다." Variables[name]이거나 리터럴이 아닌 마디입니다.
"주소 '…'이(가) 완전하지 않습니다." 포인트를 부르기에 너무 짧은 참조입니다.
"'X'을(를) 찾지 못했습니다." 읽기나 대입 대상이 아무것도 가리키지 못합니다.
"'X'은(는) 값입니다. .Value 없이 읽으십시오." 값으로 스크립트에 들어오는 포인트에서 실시간 포인트의 멤버(.Value, .ValueToBool(), .State() 등)를 읽습니다(System.StartTime.Value, Process.Oven_soak.Oven_1.Procedure.Running.ValueToBool()). 메시지는 쓴 멤버의 이름을 댑니다.
"'X'은(는) 값이 아니라 포인트 자체입니다. 조건으로 쓰면 항상 참으로 취급됩니다. X.ValueToBool()(으)로 값을 읽으십시오." 참과 거짓을 따지는 자리에 그대로 쓴 실시간 포인트: if, while, do, for, ?:의 조건, 또는 !, &&, \|\|의 피연산자(if (Variables.Start)). 경보에서는 메시지가 .IsActive를 댑니다.
"'X'은(는) 값이 아니라 포인트 자체입니다. 비교나 계산에서는 값을 읽지 않습니다. X.ValueToReal()(으)로 값을 읽으십시오." 비교나 산술에 그대로 쓴 실시간 포인트(Variables.Level > 80, total += Variables.Level). ==, !=, ===, !==에서는 메시지가 .Value를, 경보에서는 .IsActive를 댑니다. 그대로 쓴 포인트에 대한 switch, 또는 포인트를 대는 case에는 .Value 메시지가 나옵니다.
"'X'은(는) 값이 아니라 포인트 자체입니다. 절대 비어 있지 않으므로 ??는 항상 그것을 택합니다. X.Value(으)로 값을 읽으십시오." ??의 왼쪽에 그대로 쓴 실시간 포인트(Variables.Level ?? 0). 경보에서는 메시지가 .IsActive를 댑니다.
"'X'은(는) 값이 아니라 포인트 자체입니다. 텍스트 안에 써도 값이 나타나지 않습니다. X.ValueToString()(으)로 값을 읽으십시오." 템플릿 리터럴의 자리 ${…}에 그대로 쓴 실시간 포인트. 경보에서는 메시지가 .IsActive를 댑니다.
"'+='은(는) 쓰기 전에 X을(를) 값이 아니라 포인트 자체로 읽습니다. X = X.ValueToReal() + 1처럼 쓰십시오." 변수에 대한 복합 대입: +=, -=, *=, /=, %=, **=, 비트 연산 대입, &&=, \|\|=, ??=. 메시지는 쓴 연산자와 그 뜻대로 동작하는 단순 대입을 오른쪽을 쓴 그대로 두고 댑니다. 산술에는 .ValueToReal(), 비트 연산에는 .ValueToInteger(), &&=와 \|\|=에는 .ValueToBool(), ??=에는 .Value입니다.
"변수 자체에 대입하십시오: 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를 불렀습니다. 이 문장은 쓰인 동사의 이름을 부르므로, WriteAndWait에게는 두 자리 모두 그 이름이 들어간 같은 문장이 갑니다.
"WriteAndWait의 대기 시간은 밀리초 숫자여야 합니다: WriteAndWait(value, 2000)." 두 번째 인수를 적었는데 숫자가 아닙니다.
"WriteAndWait의 실패 시 계속 여부는 true 또는 false여야 합니다: WriteAndWait(value, 2000, false)." 세 번째 인수를 적었는데 true도 false도 아닙니다.
"WriteAndWait는 인수를 최대 세 개 받습니다: 값, 밀리초 단위 대기 시간, 실패 시 계속할지 여부." 네 번째 인수가 있습니다.

WriteAndWait의 이 세 메시지는 글자가 말하는 것만 보고 판단합니다. 편집기가 읽어서는 정할 수 없는 인수(변수, 계산되는 식)는 호출이 실제로 일어날 때 판단되며, 그때에는 같은 문장이 그 줄에서 실행을 끝냅니다.

JavaScript 지역 변수(let x = 1; x = x + 1;)는 이 규칙과 무관합니다.

실행

실행은 열려 있는 액션 위 모음의 첫 동사입니다. Logic 조작을 가진 역할에게만 그려지고, 스테이션이 읽기 전용인 동안 "런타임 정지"와 함께 회색이 됩니다(엔지니어링 잠금은 이것을 회색으로 만들지 않습니다. 실행하는 것은 운전이지 구성이 아니기 때문입니다). 역할이 Logic 구성도 가졌다면 편집기의 초안이 먼저 저장되고 저장된 정의가 실행됩니다. 그것이 없으면 저장되어 있는 정의가 실행됩니다(칸이 읽기 전용이므로 둘이 다를 일은 없습니다).

모든 실행은 액션 차선 위에서 새 스크립트 엔진으로 돌아가므로, 실행과 실행 사이에 상태가 새지 않고 스크립트 둘이 한꺼번에 돌지 않습니다. 부탁받은 순서대로 한 번에 하나씩 돕니다. 이 차선은 100 ms 주기가 아닙니다. 수식과 경보와 확인과 다른 데서 들어오는 쓰기는 스크립트가 도는 동안에도 계속 가므로, 주기가 스크립트 한가운데에 내려앉을 수 있고 한 스크립트 안의 두 읽기가 서로 다른 회차를 볼 수 있습니다. 그 대신, 장치를 기다리느라 멈춘 액션은 자기 뒤에 줄 선 액션만 늦출 뿐 스테이션의 다른 무엇도 늦추지 않습니다.

실행은 500 ms("스크립트를 중단했습니다: 500 ms 시간 한도를 넘겼습니다(무한 반복일 수 있습니다).")나 실행문 100,000개나 메모리 4 MB를 넘기면 중단되며, 저마다 어느 한도인지 밝히는 메시지를 남깁니다. 이 500 ms는 스크립트가 도는 시간을 잽니다. WriteAndWait가 장치를 기다리는 동안에는 세는 것을 붙들었다가 그 뒤에 다시 이어 가므로, 올바른 스크립트가 느린 설비 때문에 탓을 듣는 일은 없습니다. 꺼진 액션은 돌지 않고 실패하고("이 액션은 사용 안 함으로 되어 있습니다."), 정지된 런타임은 "로직 런타임이 실행되고 있지 않습니다."라고 답합니다.

작업 기록 줄은 모든 쓰기가 나갔으면 "12 ms 만에 정상으로 실행했습니다."라고, 스크립트 자신은 끝났는데 어떤 쓰기가 그러지 못했으면 "12 ms 만에 정상으로 실행했습니다. 쓰기 1건이 실패했습니다: Cmd: 'Cmd'에 쓰지 않았습니다. 장치가 연결되어 있지 않습니다."라고(두 번째 실패부터는 뒷부분이 "쓰기 3건이 실패했습니다. 첫 번째: Cmd: 'Cmd'에 쓰지 않았습니다. 장치가 연결되어 있지 않습니다."가 됩니다), 실행 자체가 잘못 끝났으면 "실행에 실패했습니다: <reason>"이라고 알립니다.

실패한 실행은 Events 콘솔에 올라가며, 액션의 이름과 함께 무엇이 그것을 불렀는지가 놓입니다. 동사로 실행했으면 수동, 버튼이면 Dashboard, 에이전트면 MCP, 일정으로 돌았으면 그 트리거의 이름, Process 실행이면 Process · <unit> · <action>입니다. 처음에는 경고로 기록되고, 같은 원인으로 계속 실패하는 동안에는 요약되며, 회복될 때 한 번 더 적힙니다. 그 회복 줄이 성공한 실행이 그곳에 남기는 유일한 항목입니다. 거부된 쓰기도 같은 길로 같은 이름 아래에 올라가며, 실행이 아니라 액션이 불리는 까닭도 같습니다. 설비의 답은 실행이 끝나고 몇 초 뒤에 올 수 있고, 그때에는 실패할 실행이 남아 있지 않기 때문입니다. 그냥 성공한 실행과 그것이 쓴 모든 값은 상세 수집에만 적힙니다. 주기마다 쓰는 스크립트는 값을 수천 개씩 만들어 내고, 그것으로 가득 찬 콘솔은 스테이션의 소식을 읽을 수 없는 콘솔이기 때문입니다.

마지막 실행 난간은 액션이 마지막으로 돈 때(또는 "실행한 적이 없습니다.")와 "걸린 시간: N ms"와 누가 호출했는지(아래 설명)와 주의 알림에 담긴 마지막 오류, 그리고 그 실행에서 실패한 쓰기를 따로 둔 주의 알림에(작업 기록 줄이 담았던 그 문장 그대로이므로, 성공했으면서도 설정값을 그대로 둔 실행은 여기에서도 그렇게 말합니다) 보여 주고, 이렇게 일깨웁니다. "실행은 액션 차선에서 한 번에 하나씩 처리됩니다. 이벤트 콘솔에는 실패한 실행만 올라가고, 성공한 실행과 그 실행이 쓴 값은 상세 기록으로 남습니다. 트리거는 일정에 따라 액션을 부릅니다." 이 난간은 살아 있는 액션의 것입니다. 자동 저장은 그것을 비우지 않지만, 런타임을 다시 시작하면 비워집니다.

호출한 곳

걸린 시간 아래의 "호출한 곳: …" 줄은 마지막으로 액션을 실행한 것을 말합니다.

실행한 것 줄의 내용
이 페이지의 실행 "호출한 곳: 이 페이지에서 실행"
대시보드 버튼 "호출한 곳: 대시보드 버튼"
에이전트(action_run) "호출한 곳: 에이전트"
트리거 트리거의 이름입니다. "호출한 곳: Heater off when too hot".
Process 실행의 Logic 액션 명령 유닛과 액션 묶음입니다. "호출한 곳: Process · Oven 1 · After soak".

사용하는 곳

사용하는 곳 카드는 액션을 실행하는 스테이션의 모든 것을 나열합니다("이 액션을 실행하는 스테이션의 모든 것입니다."). 액션을 열 때 읽히며, 그것을 호출하는 Process 명령, 그것에 이어진 트리거, 그것을 실행하는 대시보드 버튼마다 한 줄입니다.

종류 위치 이름
Process 명령 모델입니다. 액션 묶음과 시점입니다. After soak · 완료.
트리거 비어 있습니다. 폴더 아래의 트리거입니다.
버튼 대시보드입니다. 버튼에 쓰인 글자입니다.

아무것도 없으면 "스테이션에서 이 액션을 실행하는 것이 없습니다."라고 나옵니다. 참조를 읽을 수 없으면 "이 액션은 아직 쓰이고 있을 수 있습니다. 삭제하거나 이름을 바꾸기 전에 다시 시도하십시오."라고 나오며 다시 시도가 붙습니다. 카드는 읽기만 하므로 모든 역할이 보며, 스테이션이 엔지니어링으로 잠긴 동안에도 보입니다. 액션을 끄거나 삭제하기 전에 읽으십시오. 액션이 없어진 Process 명령은 아무것도 실행하지 않으며 자기 페이지에서 그렇게 말합니다.

호출한 실행 읽기

Process 실행이 완료 시점에 호출한 액션은 그 실행을 유닛의 LastRun 갈래 아래에서 읽습니다. 액션이 돌 때 그 갈래는 이미 그 실행을 지니고 있습니다. 시작 시점에 호출한 액션은 시작하는 실행의 메타데이터를 Procedure.Metadata 아래에서 읽습니다. Process 포인트는 변수와 달리 뒤에 .Value를 붙이지 않는 있는 그대로의 값으로 읽히며, 실행이 지니지 않은 포인트는 null로 읽히므로 먼저 확인하십시오.

if (Process.Oven_soak.Oven_1.LastRun.Verdict === "Ok") {
  Variables.Last_serial = Process.Oven_soak.Oven_1.LastRun.Metadata.Serial;
}
const peak = Process.Oven_soak.Oven_1.LastRun.Evaluations.Soak_check.Temperature_in_range.MaxValue;
if (peak !== null) {
  Variables.Last_peak = peak;
}

주소는 스크립트의 모든 주소와 마찬가지로 통째로 씁니다. 변수로 주소를 짜 맞출 수는 없습니다.

명령

명령 하는 일 회색이 되는 때 그려지지 않는 때
실행 초안을 저장하고(Logic 구성이 있을 때) 실행 하나를 대기열에 올립니다. 런타임 정지. 역할에 Logic 조작이 없을 때.
사용 / 사용 안 함 사용 표시를 뒤집습니다. 꺼진 액션은 실행을 거부하고, 그것에 이어진 모든 트리거를 쉬게 하며, 그것을 호출하는 Process 명령은 매번 거부되고 검토 필요가 됩니다. 스테이션이 잠겼거나 읽기 전용일 때. 역할에 Logic 구성이 없을 때.
복사 액션을 Actions 뿌리로 비어 있는 이름으로 복제하고 복사본은 열지 않고 그 뿌리의 표에서 강조 표시합니다(만들기와 복사 참고). 복사본에는 실행 기록도, 이어진 트리거도 없습니다. 스테이션이 잠겼거나 읽기 전용일 때. 역할에 Logic 구성이 없을 때.
액션 삭제 "'X'을(를) 삭제하시겠습니까? 이 액션이 없어집니다. 이 작업은 되돌릴 수 없습니다."라고 묻습니다. 그것에 이어져 있던 트리거는 삭제되지 않고 이어짐이 풀린 채로 남습니다. 그것을 실행하는 Process 명령은 남아서 아무것도 실행하지 않고 검토 필요가 됩니다. 스테이션이 잠겼거나 읽기 전용일 때. 역할에 Logic 구성이 없을 때.

Actions 뿌리 패널은 모든 액션을 값 열의 상태와 함께 나열합니다. "사용 · 마지막 실행 <when>"이며, 마지막 실행이 실패했으면 "· 오류"가, 성공했는데 그 쓰기 가운데 하나가 실패했으면 "· 쓰기 실패"가 붙고, 꺼져 있으면 "사용 안 함"입니다.

액션이 하지 않는 일

액션은 Process 실행 명령을 보내지 않고, 절차를 준비하지 않으며, 실행에 코멘트를 더하지 않습니다(그 포인트는 읽기 전용인 준비 상태와 준비 값입니다). 경보를 확인하지 않습니다. 나란히 돌지 않습니다. 실행과 실행 사이에 상태를 남기지 않고 함수를 함께 쓰지도 않습니다. 그리고 값의 변화나 조건으로 발동하지 않으며, 오직 실행 동사와 트리거의 간격과 대시보드 버튼과 에이전트와 Process 실행의 명령으로만 발동합니다. Process 실행은 자기가 호출한 액션을 결코 기다리지 않으며, 액션의 결과가 실행에 쓰이는 일도 없습니다.