Database

공장 시스템이 데이터베이스 테이블에 두는 값(SQL Server, PostgreSQL, MySQL과 MariaDB, SQLite, 또는 ODBC를 통한 모든 데이터베이스)을 태그로 읽고, 태그가 지시한 곳에 다시 씁니다. "데이터베이스"와 "로그인" 카드, 테이블과 열과 행으로 셀을 읽거나 자체 쿼리를 실행하는 태그, 태그가 쓰는 두 가지 방식, 열마다 태그를 제안하는 스캔, 네 가지 완전한 예, 그리고 드라이버가 하지 않는 일입니다.

Markdown으로 보기

Database 드라이버는 공장 시스템이 데이터베이스 테이블에 두는 값을 읽습니다. MES가 가진 생산 지시, ERP가 가진 레시피나 설정값, 다른 시험 시스템이 기록한 결과 같은 것입니다. 각 태그는 테이블 하나의 값 하나를 읽고, 값은 다른 모든 태그의 값과 같은 곳에 도착합니다. Logic, 대시보드, 그리고 Process 시험대의 실행 기록입니다. 태그가 지시하면 드라이버는 다시 쓰기도 합니다. 태그가 읽는 셀에 쓰거나, 태그 자체의 명령으로 씁니다.

SQL Server, PostgreSQL, MySQL과 MariaDB, SQLite에는 컴퓨터에 아무것도 설치하지 않고 연결합니다. 그 밖의 데이터베이스(Oracle, Access, Firebird 등)에는 그 데이터베이스의 ODBC 드라이버를 통해 연결하며, 그 드라이버의 64비트 버전이 컴퓨터에 설치되어 있어야 합니다.

주된 용도는 읽기이며, 그 경로는 짧습니다. 장치가 데이터베이스의 위치와 스테이션의 로그인 방법을 알려 주고, 스캔이 테이블의 열마다 태그를 제안하며, 모든 태그는 읽기 전용으로 만들어집니다. 쓰기에 관한 것은 태그의 접근이 스테이션의 쓰기를 허용한 뒤에만 그 태그에 나타납니다.

이 드라이버의 장치는 데이터베이스 하나입니다. 같은 서버의 데이터베이스 두 개는 장치 두 개입니다. 장치는 드라이버 아래에 놓이고 폴더로 정리할 수 있으며, 시리얼 회선도 브로커도 없는 다른 모든 드라이버와 마찬가지로 드라이버 → 폴더 → 장치 → 태그가 됩니다.

드라이버 페이지

머리글 아래 줄에는 "각 장치는 데이터베이스 하나를 읽습니다. 장치를 추가하고 데이터베이스의 위치와 스테이션의 로그인 방법을 입력한 다음 스캔하여 열을 태그로 추가하십시오."라고 적혀 있습니다. Connector 구성 권한이 있으면, 페이지에는 이 드라이버 고유의 스캔 범위 카드가 있어 스캔이 데이터베이스를 읽을 장치를 담습니다(장치 검색을 보십시오). 그 아래에는 다른 모든 드라이버와 같은 장치 표(장치 표를 보십시오)가 있으며, 제목 오른쪽의 장치 추가로 늘립니다. 비어 있으면 "아직 장치가 없습니다."라고 표시합니다. 드라이버 막대에는 장치 검색이 있으며, 스캔 범위 카드가 다 채워질 때까지 회색입니다. 이 드라이버는 파일과 데이터베이스 아래, File 드라이버 옆에 있습니다.

장치

이 드라이버의 장치에는 연결 카드가 없습니다. 그 자리에 데이터베이스 카드가 있고, 로그인이 없는 SQLite를 뺀 모든 데이터베이스에서는 이어서 로그인 카드가 있습니다. "장치" 카드의 읽기 주기 (ms)는 기본값이 1000이며 태그가 데이터베이스를 얼마나 자주 읽는지를 정하고, 다른 모든 드라이버와 마찬가지로 각 태그가 재정의할 수 있습니다.

새 장치는 서버가 없는 SQL Server입니다. "서버를 아직 입력하지 않음"이라고 표시하고, 페이지에는 "데이터베이스의 위치를 알려 주기 전까지 스테이션은 이 장치에 연결하지 않으므로, 아직 아무것도 읽지 않고 표시할 오류도 없습니다. 아래 데이터베이스 카드에 입력하면(서버와 데이터베이스 이름, 파일 또는 데이터 원본) 스테이션이 연결합니다."라고 표시되며, 위치를 알려 줄 때까지 아무것도 읽지 않습니다. 머리글에 보이는 기본 URI는 실행 시 주소로, 사용자도 비밀번호도 절대 담지 않습니다. SQL Server 인스턴스는 database://sqlserver?server=mes-sql&instance=SQLEXPRESS&database=MES, SQLite 파일은 database://sqlite?file=C%3A%5CData%5Crecipes.db, ODBC 데이터 원본은 database://odbc?source=ERP입니다.

"데이터베이스" 카드

필드 표시 조건 의미 기본값
데이터베이스 종류 항상 SQL Server, PostgreSQL, MySQL / MariaDB, SQLite, 기타(ODBC) 중 하나이며, 마지막 것은 "이 컴퓨터에 그 데이터베이스용으로 설치된 64비트 ODBC 드라이버를 사용합니다(Oracle, Access, Firebird 등)."라고 표시합니다. SQL Server
서버 SQL Server, PostgreSQL, MySQL / MariaDB SQL Server에서는 "호스트 이름이나 IP 주소입니다. SERVER\INSTANCE와 SERVER,PORT는 각자의 칸으로 나누어 읽습니다.", 나머지 둘에서는 "호스트 이름이나 IP 주소입니다. 콜론 뒤에 쓴 포트는 포트 칸으로 옮겨집니다." 비어 있음
포트 위와 같음 비워 두면 데이터베이스 자체의 포트이며, 빈 입력란에 그 포트가 보입니다(1433, 5432, 3306). SQL Server 인스턴스에 포트가 없으면 아무것도 보이지 않고, 서버의 SQL Server Browser가 포트를 알려 줍니다. 비어 있음
인스턴스 이름 SQL Server "기본 인스턴스라면 비워 둡니다. 포트가 없는 명명된 인스턴스는 SQL Server Browser로 찾습니다." 문자, 숫자, _, $로 최대 16자이며, 문자나 _로 시작합니다. 비어 있음
데이터베이스 이름 SQL Server, PostgreSQL, MySQL / MariaDB 테이블을 담은 서버의 데이터베이스이며, 최대 128자입니다. 비어 있음
데이터베이스 파일 SQLite "SQLite 파일의 전체 경로이며, 스테이션을 실행하는 계정의 Windows 권한으로 접근합니다. 쓰는 태그가 없으면 읽기 전용으로 엽니다." 입력란에는 힌트로 C:\Data\recipes.db가 표시됩니다. 파일을 만들지는 않습니다. 비어 있음
데이터 원본 또는 연결 문자열 기타(ODBC) "Windows ODBC 데이터 원본(64비트)에 있는 데이터 원본 이름, 또는 Driver=;Dbq=C:\Data\plant.accdb 같은 연결 문자열입니다. 비밀번호는 연결 문자열이 아니라 비밀번호 칸에 넣습니다." 비어 있음

고른 종류가 읽지 않는 필드는 표시되지 않으며, 읽게 될 때를 위해 값을 유지합니다. 다른 종류를 고르면, 이전 데이터베이스 자체의 포트로 남아 있던 포트가 비워져 새 데이터베이스는 자신의 포트로 연결됩니다. "서버" 칸은 데이터베이스 도구가 함께 쓰는 것을 나누어 읽습니다.

"서버"에 입력한 것 결과
mes-sql\SQLEXPRESS(SQL Server) 서버 mes-sql, 인스턴스 이름 SQLEXPRESS
mes-sql,1433(SQL Server) 서버 mes-sql, 포트 1433
10.0.0.5:5433 서버 10.0.0.5, 포트 5433

카드가 데이터베이스의 위치를 알려 주지 않는 동안 장치는 그대로 저장되어 대기하며, 회색 점으로 아무것도 읽지 않고 오류도 표시하지 않습니다.

데이터베이스 종류 기다리는 것 장치의 표시
SQL Server, PostgreSQL, MySQL / MariaDB 서버, 그다음 데이터베이스 이름 "서버를 아직 입력하지 않음", 그다음 "데이터베이스 이름을 아직 입력하지 않음"
SQLite 파일 "데이터베이스 파일을 아직 입력하지 않음"
기타(ODBC) 데이터 원본 또는 연결 문자열 "데이터 원본을 아직 입력하지 않음"

카드가 받아들일 수 없는 설정은 카드 아래에 표시되며, 고칠 때까지 장치는 저장되지 않습니다.

입력한 것 카드의 표시
스킴, 경로, 공백이 든 서버(http://mes-sql 등) "서버는 호스트 이름이나 IP 주소만 씁니다. 스킴, 경로, 공백은 넣지 않습니다. 함께 쓴 SQL Server 인스턴스와 포트는 각자의 칸으로 옮겨집니다."
공백이나 _와 $ 이외의 기호가 든 인스턴스 이름 "인스턴스 이름은 문자, 숫자, 밑줄, 달러 기호로 최대 16자입니다."
128자를 넘는 데이터베이스 이름 "데이터베이스 이름은 제어 문자 없이 최대 128자입니다."
전체 경로가 아닌 파일(recipes.db 등) "데이터베이스 파일은 전체 경로입니다. 드라이브, 폴더, 파일(C:\Data\recipes.db) 또는 네트워크 공유(\server\data\recipes.db)입니다."
폴더, 또는 *, ?, <, >, 따옴표가 든 경로 "폴더가 아니라 데이터베이스 파일 자체의 경로를 * ? | < > 나 따옴표 없이 입력하십시오."
대괄호, 중괄호, 소괄호, 쉼표, 세미콜론, 또는 ? * ! @ \ 중 하나가 든 데이터 원본 이름 카드는 ODBC 데이터 원본에서 그 원본이 가진 이름, 또는 연결 문자열을 요구합니다.
key=value 쌍으로 이루어지지 않은 연결 문자열(열린 채 남은 중괄호 등) "연결 문자열은 세미콜론으로 구분한 key=value 쌍입니다. 세미콜론이 든 값은 중괄호로 감쌉니다."
PWD=나 Password=가 든 연결 문자열 "연결 문자열에서 비밀번호를 빼고 비밀번호 칸에 입력하십시오. 연결 문자열은 화면에 보이고 진단 로그에도 기록되지만, 비밀번호 칸은 보호하여 보관합니다."

저장에도 같은 규칙이 적용되며, 거부하면 피드가 알려 줍니다. "장치 'MES'에 드라이버가 사용할 수 없는 데이터베이스 설정이 있습니다. 장치를 열어 패널이 표시하는 필드를 고치십시오."

"로그인" 카드

SQLite를 뺀 모든 데이터베이스에는 로그인 카드가 있으며, 스테이션이 로그인할 사용자를 담습니다.

필드 표시 조건 의미 기본값
스테이션의 Windows 계정으로 로그인 SQL Server 켜짐: "스테이션을 실행하는 Windows 계정으로 SQL Server에 로그인합니다. 사용자나 비밀번호는 저장하지 않습니다." 꺼짐: "데이터베이스 사용자와 그 비밀번호로 SQL Server에 로그인합니다." 꺼짐
사용자 이름 사용자로 로그인하는 서버, 그리고 선택 사항인 ODBC 데이터베이스 사용자입니다. 비어 있음
비밀번호 위와 같음 사용자의 비밀번호로, 드라이버의 다른 모든 자격 증명과 같이 보호하여 저장합니다. 다시 표시되지 않고, 주소나 진단 로그에 쓰이지 않으며, 에이전트에게 돌려주지도 않습니다. 비어 있음
암호화 SQL Server 암호화, 인증서 확인: "연결은 암호화되며, 서버의 인증서를 이 컴퓨터가 신뢰하는 인증서와 대조합니다." 암호화, 모든 인증서 허용: "연결은 암호화되고 모든 인증서를 허용합니다. 자체 인증서를 쓰는 공장 서버에 필요한 설정입니다. 서버의 신원은 확인하지 않습니다." 암호화 안 함: "값과 명령이 암호화되지 않은 채 전송됩니다. 암호화를 제공하지 않는 오래된 서버에만 쓰십시오." 암호화, 인증서 확인

PostgreSQL과 MySQL에는 "암호화" 필드가 없습니다. 서버가 제공하면 연결이 암호화됩니다. 공장 서버에 흔한, 자체 인증서를 가진 SQL Server는 신뢰할 수 없는 기관이 발급한 인증서 체인에 관한 데이터베이스 자체의 말로 연결을 거부합니다. 그 서버가 요구하는 선택은 암호화, 모든 인증서 허용입니다.

필드 아래에서 카드는 어떤 사용자를 요청할지 알려 줍니다. "데이터베이스 관리자에게 스테이션에 필요한 권한만 가진 사용자를 요청하십시오. 읽기, 그리고 태그가 바꾸는 테이블에만 쓰기입니다." 스테이션은 그 사용자가 할 수 있는 모든 것으로 다른 시스템의 데이터를 읽고 쓰므로, 이 사용자가 스테이션이 바꿀 수 있는 것의 실제 한계입니다. 모든 쓰기는 다른 모든 드라이버와 마찬가지로 진단 로그에 기록됩니다.

사용자로 로그인하는 서버에 아직 사용자가 입력되지 않았으면 대신 "스테이션이 로그인할 사용자를 입력하십시오. 그전까지 스테이션은 이 장치에 연결하지 않습니다."라고 표시합니다. 이것은 거부가 아닙니다. 장치는 저장되며, 사용자가 입력될 때까지 그 오류는 데이터베이스 사용자가 아직 입력되지 않았다고 알려 줍니다.

온라인, 대기, 오프라인

상황 장치와 태그가 하는 일
"데이터베이스" 카드가 데이터베이스의 위치를 알려 주지 않음 장치는 대기하며, 회색 점으로 아무것도 읽지 않고 오류도 없습니다(위를 보십시오).
사용자로 로그인하는 서버에 사용자가 입력되지 않음 스테이션은 장치에 연결하지 않으며, 그 오류는 데이터베이스 사용자가 아직 입력되지 않았다고 알려 줍니다.
서버가 응답하지 않거나, 로그인을 거부하거나, SQLite 파일이 없음 장치는 데이터베이스 자체가 알려 주는 원인과 함께 오프라인이 되며, 스테이션은 가능해지는 즉시 연결합니다. 연결은 최대 10 s 기다립니다.
연결이 끊김(서버가 다시 시작됨, 네트워크가 끊어짐) 장치는 오프라인이 되었다가 다시 연결합니다.
데이터베이스가 거부한 문, 또는 10 s가 지나도 끝나지 않은 문 그 태그의 읽기 실패이며, 데이터베이스 자체의 말이 붙습니다. 장치는 다른 태그를 계속 읽습니다.
태그가 아직 행이 없는 테이블의 최신 행을 읽음 그 태그는 오류 없이 대기하며, 첫 행이 기록될 때까지 장치의 상태 건전성에서 세지 않습니다. 장치가 온라인인지는 다른 태그가 알려 줍니다. 태그가 읽은 뒤에 비워진 테이블은 이 대기가 아닙니다. 태그는 마지막 읽은 값을 유지하며, 그 값은 다른 모든 드라이버와 마찬가지로 읽기 주기에 10 s를 더한 시간보다 오래되면 실패로 셉니다.

각 장치는 자신만의 연결을 가집니다. 연결할 때 열리며 공유되거나 풀에 놓이지 않으므로, 서버가 끊은 연결이 다시 쓰이는 일은 없습니다.

서버 준비

네트워크로 쓰는 세 데이터베이스는 흔한 설치에서 다른 컴퓨터에 닫힌 채 출하됩니다. 다음 설정은 모두 서버를 관리하는 사람이 서버에서 합니다. 스테이션은 어느 것도 바꾸지 않습니다.

데이터베이스 스테이션을 막는 것 바꾸는 곳
SQL Server TCP/IP가 꺼져 있음(SQL Server Express와 Developer는 이렇게 출하됨) SQL Server Configuration Manager > SQL Server Network Configuration > Protocols for 인스턴스: TCP/IP를 사용으로 바꾸고, SQL Server Services에서 SQL Server(인스턴스)를 다시 시작
SQL Server 명명된 인스턴스가 스스로 고른 포트에서 수신 대기함 TCP/IP > IP Addresses > IPAll: TCP Dynamic Ports를 비우고 TCP Port에 포트를 입력한 뒤 다시 시작. 또는 장치의 포트 칸을 비우고 인스턴스 이름을 지정
SQL Server 포트 없는 명명된 인스턴스는 SQL Server Browser로 찾는데, 그것이 멈췄거나 막혀 있음(오류 26) SQL Server Services: SQL Server Browser 시작, Start Mode Automatic. 서버 방화벽에서 UDP 1434 허용
PostgreSQL listen_addresses가 기본값인 localhost postgresql.conf: listen_addresses = '*'로 바꾼 뒤 PostgreSQL 다시 시작
PostgreSQL pg_hba.conf의 어떤 줄도 이 스테이션의 주소를 들여보내지 않음(SQLSTATE 28000) pg_hba.conf: 데이터베이스, 사용자, 이 스테이션의 주소에 대한 host 줄을 scram-sha-256으로 추가(MD5로 저장된 비밀번호는 md5)한 뒤 SELECT pg_reload_conf();
MySQL, MariaDB 많은 패키지가 설정하듯 bind-address가 127.0.0.1이거나 skip-networking이 켜져 있음 구성 파일의 [mysqld] 섹션: bind-address = 0.0.0.0, skip-networking 삭제 후 다시 시작
MySQL, MariaDB 이 스테이션의 주소를 위한 계정이 없음(오류 1130) 이 스테이션 주소의 사용자를 CREATE USER로 만들고 태그에 필요한 권한을 GRANT

어느 경우든 서버 컴퓨터의 방화벽에서 데이터베이스 포트를 허용해야 합니다. 서버가 이 중 한 가지로 응답하면, 장치 페이지가 데이터베이스의 영어 오류 대신 어떤 설정인지를 이 절차와 이 장치의 값(포트, 인스턴스, 서버가 본 이 스테이션의 주소, pg_hba.conf 줄, MySQL 계정. 각각 복사 단추 포함)과 함께 알려 줍니다. 이 알림은 장치가 연결되거나 서버가 다르게 응답하면 저절로 사라집니다. 저널과 에이전트도 같은 절차를 읽습니다.

태그 주소 지정

태그가 읽는 방식

이 드라이버의 태그에는 자체 주소 입력란이 없습니다. 신호원 카드가 어떻게 읽을지 묻습니다.

읽는 내용 태그가 보여 주는 것 필드
테이블과 열 셀, 즉 테이블의 한 행에 있는 값 열입니다. 테이블, 값 열, 읽을 행과 행의 필드
자체 쿼리 자체 SELECT가 돌려주는 첫 행의 첫 열입니다. 쿼리 본문

새 태그는 테이블과 열을 키로 읽으며 Double입니다. 제공되는 형식은 Boolean, Int32, Int64, Float, Double, String, DateTime입니다. 셀을 읽을 때 정수 태그는 소수부가 있는 값을 반올림하지 않고 거부하며(쓰기는 그 반대이며 쓰기 참조), 텍스트는 숫자일 때만 숫자로 읽습니다. 모든 태그는 읽기 전용으로 만들어지며, 쓰기가 더하는 것은 쓰기에 있습니다.

테이블과 열

필드 표시 조건 의미 기본값
테이블 테이블과 열 "이름, 또는 스키마와 이름(dbo.Orders)입니다. 공백이나 대문자가 든 이름은 [Order Lines]처럼 따옴표나 대괄호로 감쌉니다." 비어 있음
값 열 테이블과 열 셀이 태그의 값이 되는 열입니다. 비어 있음
읽을 행 테이블과 열 키로 선택: "키 열에 키 값이 든 행입니다. 같은 테이블과 행의 태그는 쿼리 하나로 함께 읽습니다." 최신 행: "날짜 열의 값이 가장 큰 행입니다. 날짜와 시간, 또는 커지기만 하는 숫자입니다. 같은 테이블과 행의 태그는 쿼리 하나로 함께 읽습니다." 키로 선택
키 열 키로 선택 행을 고르는 열입니다(OrderNo 등). 비어 있음
키 값 키로 선택 읽을 행에서 키 열이 가진 것이며(4711 등), 텍스트로 입력합니다. 데이터베이스는 그것을 그 열의 값처럼 읽습니다. 비어 있음
날짜 열 최신 행 가장 큰 값이 최신 행이 되는 열입니다(updated_at 등). 비어 있음

이름은 데이터베이스가 읽는 대로 읽힙니다.

쓴 형태 읽히는 방식
Orders 단순한 이름으로, 데이터베이스가 단순한 이름을 읽는 대로 읽습니다. PostgreSQL은 소문자, Oracle은 대문자입니다.
"Order Lines", [Order Lines] 데이터베이스 자체가 받아들이는 따옴표가 무엇이든 이름 그대로입니다.
dbo.Orders 스키마와 테이블입니다. 따옴표 밖의 점이 둘을 나눕니다.

드라이버는 이름의 각 부분을 그 데이터베이스가 받아들이는 따옴표로 감싸므로, 이름이 텍스트로 문에 붙여 넣어지는 일은 없습니다. 필드가 작동할 수 없는 태그는 저장되지 않으며, 그 페이지가 빠진 것을 알려 줍니다.

비워 두거나 입력한 것 태그 페이지의 표시
테이블 없음 "값이 있는 테이블을 입력하십시오."
세 부분으로 된 테이블, 또는 닫히지 않은 따옴표 "테이블은 이름, 또는 스키마와 이름(dbo.Orders)입니다. 공백이 든 이름은 따옴표나 대괄호로 감쌉니다. 각 부분은 최대 128자입니다."
값 열 없음 "값의 열을 입력하십시오."
두 부분으로 된 값 열 "값 열은 이름 하나입니다. 공백이 든 이름은 따옴표나 대괄호로 감쌉니다."
키로 선택, 키 열 없음 "행을 고르는 키 열을 입력하십시오."
키로 선택, 키 값 없음 "키 값을 입력하십시오. 읽을 행에서 키 열이 가진 값입니다."
최신 행, 날짜 열 없음 "가장 큰 값이 최신 행이 되는 날짜 열을 입력하십시오."

읽기 전용인 신호원 주소 (버스) 줄은 드라이버가 받는 것을 보여 줍니다. 키로 선택한 행이면 row?table=dbo.ProductionOrders&column=Quantity&key=OrderNo&equals=4711, 최신 행이면 newest?table=recipe_setpoints&column=oven_temperature&by=updated_at입니다.

자체 쿼리

필드 의미 기본값
쿼리 본문 "읽기만 하는 SELECT 하나입니다. 값은 첫 행의 첫 열입니다. @now는 스테이션의 날짜와 시간입니다." WITH로 시작하고 읽기만 하는 쿼리도 받아들입니다. 비어 있음

쿼리는 데이터베이스가 읽는 대로 읽힙니다. 따옴표로 감싼 텍스트, 따옴표로 감싼 이름, 주석 안에 있는 것은 문의 단어가 아닙니다. 읽기 이상을 하는 쿼리는 입력한 곳에서 거부됩니다.

입력한 것 태그 페이지의 표시
아무것도 없음 "쿼리를 입력하십시오. 첫 행의 첫 열이 값이 되는 SELECT 하나입니다."
SELECT가 아닌 문(UPDATE나 DELETE 등) "쿼리는 SELECT나 WITH로 시작합니다. 쓰려면 태그의 액세스가 쓰기를 허용하게 하고 쓰기 명령을 사용하십시오."
데이터베이스를 바꾸는 SELECT(SELECT ... INTO, FOR UPDATE, 또는 INSERT, UPDATE, EXEC가 든 것) "이 쿼리는 데이터베이스를 바꿉니다(INSERT, UPDATE, SELECT INTO, FOR UPDATE, EXEC 등). 쿼리는 읽기만 합니다."
문 두 개 "쿼리에 문이 둘 이상 있습니다. SELECT 하나만 남기십시오."
닫히지 않은 따옴표, 괄호, 주석 "쿼리의 따옴표, 괄호 또는 주석이 닫히지 않았습니다."
@now 이외의 값(@order 등) "쿼리는 스테이션의 날짜와 시간인 @now만 받습니다. 다른 값은 본문에 직접 쓰십시오."

쿼리 태그의 버스 주소는 query?sql= 뒤에 퍼센트 인코딩한 쿼리가 붙습니다.

읽기

읽는 태그 읽는 방식
키로 선택 키 열이 키 값과 같은 행에서 그 태그의 열을 읽습니다. 키 값은 매개 변수로 데이터베이스에 전달합니다.
최신 행 날짜 열이 그 열의 가장 큰 값을 가진 행에서 그 태그의 열을 읽습니다(WHERE ... = (SELECT MAX(...) FROM ...)). 모든 데이터베이스와 ODBC가 똑같이 읽는 형태이며, 두 행이 같으면 첫 행을 읽습니다.
같은 테이블과 행의 여러 태그 한 번의 순회에서 그 열 모두를 쿼리 하나로 읽어, 공장의 데이터베이스에 태그마다 묻지 않게 합니다. 데이터베이스가 그 쿼리를 거부하면(테이블에 없는 열 등) 그 태그 자체의 열만 읽고, 그 뒤로 그 행은 열마다 따로 읽습니다. 잘못된 열은 그 태그만 손해를 봅니다.
자체 쿼리 쓴 그대로의 쿼리이며, @now는 매개 변수로 전달합니다.
데이터베이스의 응답 태그
태그가 읽는 형식의 값 그 값을 읽습니다.
빈 셀(NULL) 읽기에 실패합니다.
키 값을 가진 행이 없거나 둘 이상 읽기에 실패합니다. 태그는 행 하나를 읽습니다.
아직 행이 없는 테이블의 최신 행 오류 없이 대기합니다.
행을 돌려주지 않는 쿼리 읽기에 실패합니다.
태그의 형식이 읽지 않는 값(Int32 태그의 텍스트, 정수 태그의 소수부) 이유와 함께 읽기에 실패합니다.

읽기에 실패해도 태그는 마지막 읽은 값을 유지하며, 그 값은 다른 모든 드라이버와 마찬가지로 읽기 주기에 10 s를 더한 시간보다 오래되면 실패로 셉니다. 데이터베이스에는 읽을 때마다 묻습니다. 다른 프로그램이 바꾼 것은 바꾼 순간이 아니라 다음 읽기에서 보입니다.

쓰기

태그는 접근이 읽기와 쓰기나 쓰기 전용이 된 뒤에만 씁니다. 그때 신호원 카드에 쓰기가 무엇을 하는지가 더해집니다.

필드 표시 조건 의미 기본값
쓰기 동작 태그가 씀 읽는 셀을 바꿈: "이 태그가 읽는 셀을 한 행에서만 바꿉니다. 아직 대기 중인 새 값은 이전 값을 대체합니다." 쓰기 명령을 실행: "아래 쓰기 명령을 실행합니다. 모든 쓰기가 유효하며, 대기 중인 쓰기가 새 쓰기 때문에 버려지지 않습니다." 자체 쿼리를 읽는 태그에는 바꿀 셀이 없어 쓰기 명령을 실행만 제시됩니다. 읽는 셀을 바꿈
쓰기 명령 쓰기 명령을 실행 "WHERE가 있는 UPDATE, INSERT 또는 저장 프로시저 호출입니다. @value는 쓸 값이고 @now는 스테이션의 날짜와 시간입니다. 값은 항상 매개 변수로 전달되며 본문에 붙여 넣지 않습니다." 빈 입력란에는 힌트로 INSERT INTO results (result, recorded_at) VALUES (@value, @now)가 표시됩니다. 비어 있음

쓰기 명령을 실행하는 쓰기 전용 태그는 아무것도 읽지 않으므로, 그 신호원 카드에는 쓰기만 있습니다.

쓰기 진행 방식
읽는 셀을 바꿈 태그의 행에서 값 열을 @value로 바꾸는 UPDATE 하나를, 정확히 한 행이 바뀌지 않으면 되돌리는 트랜잭션 안에서 실행합니다. 어떤 행에도 없는 키 값이나 두 행에 있는 키 값이면 아무것도 쓰지 않고 그렇게 알려 줍니다. 모든 설정값과 마찬가지로, 아직 대기 중인 새 값은 이전 값을 대체합니다.
쓰기 명령을 실행 쓰기마다 한 번, 값을 @value, 스테이션의 날짜와 시간을 @now로 하여 명령을 실행합니다. 모든 쓰기가 유효합니다. INSERT 두 번은 행 두 개가 되며, 대기 중인 쓰기가 새 쓰기 때문에 버려지는 일은 없습니다. 저장 프로시저는 EXEC, CALL, 또는 ODBC의 {call ...}로 호출합니다.
정수 태그에 쓰는 소수부가 있는 값 반올림되며 거부되지 않습니다. 스케일링도 교정도 없는 정수 태그(Int32 또는 Int64)에 소수부가 있는 값을 쓰면 데이터베이스에 닿기 전에 가장 가까운 정수로 반올림되며, 절반은 0에서 먼 쪽으로 갑니다(2.5는 3, -2.5는 -3이 됩니다). 소수부를 거부하는 것은 셀을 읽을 때이며 값을 쓸 때가 아닙니다.
응답 완료, 또는 데이터베이스 자체의 말로 된 거부입니다. 사용자에게 없는 권한, 행이 어기는 제약 조건, 열이 받아들이지 않는 값 등입니다.

드라이버가 실행할 수 없는 명령은 태그 페이지에서 거부됩니다.

입력한 것 태그 페이지의 표시
아무것도 없음 "쓰기 명령을 입력하십시오. @value가 든 UPDATE, INSERT 또는 저장 프로시저 호출입니다."
다른 단어로 시작하는 명령(DELETE 등) "쓰기 명령은 UPDATE, INSERT, EXEC 또는 CALL로 시작합니다."
문 두 개 "쓰기 명령에 문이 둘 이상 있습니다. 하나만 남기거나 저장 프로시저를 호출하십시오."
닫히지 않은 따옴표, 괄호, 주석 "쓰기 명령의 따옴표, 괄호 또는 주석이 닫히지 않았습니다."
@value 없음 "쓸 값이 들어갈 자리에 @value를 넣으십시오. 값은 항상 매개 변수로 전달되며 본문에 붙여 넣지 않습니다."
@value와 @now 이외의 값(@line 등) "쓰기 명령은 쓸 값인 @value와 스테이션의 날짜와 시간인 @now만 받습니다."
WHERE가 없는 UPDATE "WHERE가 없는 UPDATE는 테이블의 모든 행을 바꿉니다. 행을 고르는 WHERE를 추가하십시오."

@@로 시작하는 이름(SQL Server의 함수)과 EXEC의 인수 이름(@speed = @value)은 값이 아니며 쓴 그대로 남습니다. 저장에도 같은 규칙이 적용되며, 태그를 거부하면 피드가 알려 줍니다. "태그 'Order quantity'이(가) 데이터베이스에서 값의 위치를 알려 주지 않거나, 드라이버가 거부하는 쿼리나 쓰기 명령을 가지고 있습니다. 태그를 열어 태그 패널이 표시하는 필드를 고치십시오."

버스 주소에는 쓰기가 더해집니다. 셀이면 row?table=recipes&column=setpoint&key=code&equals=R-100&write=cell, 명령을 실행하는 쓰기 전용 태그면 none?write=command&command= 뒤에 명령이 붙습니다.

장치 검색

"스캔 범위" 카드

Connector 구성 권한이 있으면 드라이버 페이지에는 스캔 범위 카드가 있고, 그 아래에 "장치와 같은 방법으로 로그인하여, 테이블의 열마다 최신 행이나 키가 가장 작은 행의 태그를 제안합니다."라는 줄이 있습니다.

필드 의미 기본값
스캔할 장치 이 드라이버의 장치를 이름으로 고릅니다. 데이터베이스는 로그인 정보를 가진 장치를 통해서만 스캔하며, 저장을 기다리는 장치의 편집은 먼저 저장됩니다. 이름순으로 첫 장치
테이블 "비워 두면 모든 테이블입니다. 이름이나, Recipe*처럼 *가 임의의 문자를 뜻하는 패턴도 쓸 수 있습니다." 비어 있음

장치가 없는 드라이버에는 "데이터베이스는 로그인 정보를 가진 장치를 통해 스캔합니다. 이 드라이버의 장치를 추가하고 데이터베이스의 위치를 입력하십시오."만 표시됩니다. 범위에 아직 빠진 것은 카드 아래에 빨간색으로 표시되며, 범위가 다 채워질 때까지 장치 검색은 회색으로 남습니다.

범위 카드의 표시
데이터베이스의 위치를 알려 주지 않거나, 드라이버가 사용할 수 없는 설정이 있는 장치 "장치 'Recipes'이(가) 아직 데이터베이스의 위치를 알려 주지 않거나, 드라이버가 사용할 수 없는 설정이 있습니다. 먼저 데이터베이스 카드를 완성하십시오."
스키마, 따옴표, 대괄호, 세미콜론이 든 패턴(dbo.Recipe* 등) "'dbo.Recipe*'은(는) 테이블 이름도 패턴도 아닙니다. 이름이나, *가 임의의 문자를 뜻하는 패턴을 스키마나 따옴표 없이 쓰십시오."
더 이상 없는 장치 "스캔하려고 고른 장치가 더 이상 없습니다. 스캔할 다른 장치를 고르십시오."

스캔할 장치에 저장할 수 없는 편집이 있으면 스캔은 시작하지 않습니다. "스캔할 장치의 편집을 저장하지 못해 장치 검색을 시작하지 않았습니다."

스캔이 제시하는 것

스캔은 장치와 같은 방법으로 로그인하고, 데이터베이스 자체가 가진 테이블과 뷰(시스템 것은 제외)와 그 열의 목록을 읽으며, 읽는 테이블을 "recipes의 열을 읽는 중…"처럼 알려 줍니다. 후보는 하나로, 장치 자체가 이미 설정됨으로 표시됩니다. 그 카드에는 장치의 어떤 태그도 아직 읽지 않는 열이 체크된 채 나열되며, 열기 앞에 있는 태그로 추가가 체크한 것을 읽기 전용으로 장치에 추가합니다.

테이블 후보 태그
날짜와 시간 열이 있음 열마다 하나이며, 그런 첫 열로 최신 행을 읽습니다.
없음 키를 뺀 열마다 하나이며, 기본 키(기본 키가 없는 테이블에서는 첫 열)의 값이 가장 작은 행을 읽습니다. 다른 행을 읽으려면 태그의 키 값을 바꿉니다.
없고 행도 없음 제외됩니다.
어떤 태그 형식도 읽지 않는 열(이진 데이터, 지오메트리) 제외되며, 스캔을 마치는 줄에서 셉니다.

태그는 테이블과 열의 이름을 받고(recipes.oven_temperature), 열의 형식에 맞는 형식을 가지며, 모두 읽기 전용입니다. 스캔은 테이블 최대 100개, 값 최대 500개를 읽으며, 거기서 잘린 스캔은 "Recipes의 스캔이 일찍 멈췄습니다. 스캔은 테이블 최대 100개, 값 최대 500개를 읽습니다. 나머지를 보려면 테이블 이름이나 패턴을 지정하십시오."라고 알려 줍니다. 스캔의 다른 동작은 장치 검색에 있습니다.

장치 자신의 페이지도 드라이버 페이지 없이 같은 일을 합니다. 태그 카드 머리의 태그 검색은 장치와 똑같이 로그인해 저장된 그대로 데이터베이스를 스캔하고, 아직 태그가 없는 열만 제시합니다(장치의 태그 검색 참고).

예: SQL Server의 생산 지시

MES는 생산 지시를 SQL Server의 MES 데이터베이스, dbo.ProductionOrders 테이블에 지시 번호마다 한 행으로 둡니다.

  1. 드라이버 페이지에서 장치 추가를 누르고 이름을 MES로 합니다. 데이터베이스 카드에서 SQL Server를 그대로 두고, 서버에 mes-sql(명명된 인스턴스라면 mes-sql\SQLEXPRESS)을 입력하고, 포트는 비워 두고, 데이터베이스 이름에 MES를 입력합니다.
  2. 로그인 카드에서 사용자 이름에 station_reader와 그 비밀번호를 입력하거나, 스테이션의 Windows 계정으로 로그인을 켭니다. 자체 인증서를 가진 공장 서버라면 암호화, 모든 인증서 허용을 고릅니다.
  3. 태그 추가로 Order quantity, Int32: 테이블 dbo.ProductionOrders, 값 열 Quantity, 읽을 행 키로 선택, 키 열 OrderNo, 키 값 4711. 버스 주소는 row?table=dbo.ProductionOrders&column=Quantity&key=OrderNo&equals=4711입니다.
  4. 태그 추가로 Product, String, 같은 테이블과 행에서 값 열은 ProductCode. 두 태그는 쿼리 하나로 읽힙니다.

도구로는 다음과 같습니다.

device_upsert name=MES driver=Database databaseKind=SqlServer host="mes-sql\SQLEXPRESS" databaseName=MES username=station_reader password=<password> databaseEncryption=TrustServerCertificate
tag_upsert device=MES name="Order quantity" opcUaType=Int32 databaseTable=dbo.ProductionOrders address=Quantity databaseRow=Key databaseKeyColumn=OrderNo databaseKeyValue=4711
tag_upsert device=MES name=Product opcUaType=String databaseTable=dbo.ProductionOrders address=ProductCode databaseRow=Key databaseKeyColumn=OrderNo databaseKeyValue=4711

예: PostgreSQL의 레시피 설정값

레시피 시스템은 설정값이 바뀔 때마다 recipe_setpoints에 행을 추가하고, updated_at 열에 날짜를 넣습니다.

  1. 장치 추가를 누르고 이름을 Recipes로 합니다. 데이터베이스 종류 PostgreSQL, 서버 recipes-db, 포트는 비워 두고(PostgreSQL의 5432), 데이터베이스 이름 recipes, 그리고 로그인 카드에서 사용자 이름과 비밀번호를 입력합니다.
  2. 태그 추가로 Oven setpoint, Double: 테이블 recipe_setpoints, 값 열 oven_temperature, 읽을 행 최신 행, 날짜 열 updated_at.

새 행은 태그의 다음 읽기에서 읽힙니다. PostgreSQL은 단순한 이름을 소문자로 읽으므로, 대문자로 만든 열(OvenTemp 등)은 따옴표로 감싸 "OvenTemp"로 씁니다. 도구로는 다음과 같습니다.

device_upsert name=Recipes driver=Database databaseKind=PostgreSql host=recipes-db databaseName=recipes username=station password=<password>
tag_upsert device=Recipes name="Oven setpoint" opcUaType=Double databaseTable=recipe_setpoints address=oven_temperature databaseRow=Newest databaseDateColumn=updated_at

예: INSERT로 쓰는 결과 행

품질 시스템은 측정한 부품마다 test_results 테이블에 행 하나를 원합니다.

  1. 그 데이터베이스의 장치에서 태그 추가로 Result, Double, 접근은 쓰기 전용으로 합니다.
  2. 쓰기 동작은 쓰기 명령을 실행으로 하고, 쓰기 명령에는 행을 추가하는 INSERT INTO test_results (result, recorded_at) VALUES (@value, @now)를 씁니다.

Logic이 Result에 쓰는 값은 저마다 별도의 행이 되며, 옆에 스테이션의 날짜와 시간이 들어갑니다. 연달아 일어난 쓰기도 모두 순서대로 남고, 새 쓰기 때문에 버려지는 것은 없습니다. 셀을 읽는 읽기와 쓰기 태그라면 쓸 때마다 그 한 행을 바꿉니다. 도구로는 다음과 같습니다.

tag_upsert device=Quality name=Result opcUaType=Double accessType=WriteOnly databaseWriteMode=Command databaseCommand="INSERT INTO test_results (result, recorded_at) VALUES (@value, @now)"

예: ODBC를 통한 Access와 Oracle

데이터베이스 이 컴퓨터에 필요한 것 장치의 설정
Microsoft Access Microsoft의 Access Database Engine, 64비트 데이터베이스 종류 기타(ODBC), 데이터 원본 또는 연결 문자열 Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Data\plant.accdb, 사용자 없음
Oracle Oracle의 64비트 ODBC 드라이버와, 그것으로 ODBC 데이터 원본(64비트)에 만든 데이터 원본 ERP 데이터베이스 종류 기타(ODBC), 데이터 원본 또는 연결 문자열 ERP, 로그인 카드에서 사용자 이름과 비밀번호

장치가 지정한 데이터 원본이나 드라이버가 32비트 프로그램용으로만 있거나(32비트 Office의 Access, ODBC 데이터 원본(32비트)에서 만든 데이터 원본 등) 이 컴퓨터에 아예 없으면, 장치 패널은 장치가 지정한 이름과 함께 둘 중 어느 경우인지 알려 주고, 장치가 켜져 있고 연결되지 않는 동안 전체 안내를 보여 줍니다. 장치의 오류도 영어로 같은 내용을 알려 주며, driver_capabilities도 Database 드라이버의 prerequisite(perDevice가 true)에서 같은 내용을 알려 줍니다.

항목 내용
없는 것 그 데이터 원본이나 드라이버용 64비트 ODBC 드라이버. Ganter Lab은 64비트 프로그램이라 64비트 ODBC 드라이버와 그것으로 만든 데이터 원본만 볼 수 있으며, 다른 제조사의 드라이버를 포함할 수 없습니다
받는 곳 데이터베이스 제조사. Access의 경우 Microsoft 페이지 'Download and install Microsoft 365 Access Runtime'이며, 그 런타임에 Access Database Engine이 들어 있습니다
고를 것 64비트 버전(Access의 경우 사용하는 언어의 64비트 다운로드 버튼). 32비트 버전은 고르지 않습니다
설치 방법 관리자 권한으로 실행합니다. 그다음 데이터 원본 이름을 지정한 장치라면 ODBC 데이터 원본(64비트)에서 같은 이름, 같은 데이터베이스로 데이터 원본을 만듭니다
자주 겪는 문제 Office가 있는 컴퓨터에서 Access의 경우: Microsoft 페이지에 따르면 설치되는 Access Runtime은 이미 설치된 Office에 맞춰지며 Windows Installer로 설치된 Office와는 호환되지 않습니다. 또한 Office 64비트 버전과 32비트 버전 중에서 고르는 방법에 관한 Microsoft 페이지에 따르면 한 버전을 제거한 다음 다른 버전을 설치합니다
그다음 다음 연결 시도에서 장치는 지금 설정 그대로 연결됩니다. Ganter Lab을 다시 시작할 필요는 없습니다

알림 끝에는 이 컴퓨터에 있는 64비트 ODBC 드라이버가 Driver={...}에 쓰는 이름으로 나열됩니다. 64비트 쪽에 있는데도 실패하는 데이터 원본이나 드라이버는 드라이버 관리자 자체의 오류를 보여 줍니다.

ODBC를 통하면 단순한 이름은 데이터베이스가 읽는 대로(Oracle에서는 대문자로) 읽히고, 따옴표로 감싼 이름은 그대로 읽힙니다. 날짜와 시간은 모든 ODBC 드라이버가 받아들이는 가장 세밀한 단위인 초 단위로 보냅니다. 도구로는 다음과 같습니다.

device_upsert name="Plant book" driver=Database databaseKind=Odbc databaseOdbc="Driver={Microsoft Access Driver (*.mdb, *.accdb)};Dbq=C:\Data\plant.accdb"
device_upsert name=ERP driver=Database databaseKind=Odbc databaseOdbc=ERP username=STATION password=<password>

에이전트 도구

driver_capabilities는 이 드라이버를 database 아래에서 설명합니다. 간단한 경로, 각 데이터베이스와 그 필드와 자체 포트, 암호화 선택, 태그가 읽는 두 가지 방식과 쓰는 두 가지 방식, 값은 @value나 @now로만 문에 들어간다는 규칙, 형식, 대기 시간, 데이터베이스 사용자에 관한 조언, 장치 검색, 그리고 네 가지 완전한 예입니다. device_upsert driver=Database는 databaseKind(기본값 SqlServer, PostgreSql, MySql, Sqlite, Odbc)를 받고, 서버에서는 host(SQL Server의 server\INSTANCE나 server,port는 나누어 읽습니다), port, databaseName, SQL Server에서는 추가로 databaseInstance, databaseWindowsSignIn, databaseEncryption(Verified, TrustServerCertificate, Off), SQLite에서는 databaseFile, ODBC에서는 databaseOdbc, 그리고 username과 절대 돌려주지 않는 password를 받습니다. 돌려주는 장치에는 database가 있으며, 거기에 주소와 장치가 아직 사용자를 기다리는지가 담깁니다. tag_upsert는 값 열을 address로, databaseSource(Fields나 Query), databaseTable, databaseRow(Key나 Newest), databaseKeyColumn, databaseKeyValue, databaseDateColumn, databaseQuery, 그리고 accessType이 쓸 때는 databaseWriteMode(Cell이나 Command)와 databaseCommand를 받습니다. 새 태그는 opcUaType으로 달리 지정하지 않으면 읽기 전용인 Double입니다. device_discover driver=Database는 이 드라이버의 설정된 장치 이름인 databaseDevice와, 선택 사항인 databaseTables(테이블 이름이나 *를 쓰는 패턴)를 받습니다. 장치에 빠진 태그는 tag_upsert로 추가합니다. connector_browse는 각 장치의 databaseKind를 돌려줍니다. 다른 도구는 에이전트 도구에 있습니다.

알아 둘 한계

  • 드라이버는 태그의 값을 태그마다 하나씩 읽고 씁니다. 스테이션의 실행 기록을 데이터베이스에 기록하지는 않습니다. 일련번호, 판정, 측정값을 담은 실행마다의 행 하나는 이 드라이버가 쓰는 것이 아닙니다.
  • 제품에는 ODBC 드라이버가 들어 있지 않습니다. Oracle, Access, Firebird 등 직접 연결하는 네 가지 이외의 데이터베이스에는 그 데이터베이스 자체의 64비트 ODBC 드라이버를 컴퓨터에 설치해야 합니다. 32비트 드라이버는 보이지 않습니다.
  • 장치는 Windows 비밀번호를 저장하지 않습니다. SQL Server에 대한 Windows 로그인과 네트워크 공유에 있는 SQLite 파일은 스테이션을 실행하는 계정을 쓰므로, 데이터베이스나 공유는 그 계정을 받아들여야 합니다.
  • 쿼리는 읽기만 합니다. 데이터베이스를 바꾸는 것은 쓰기이며, 쓰기는 접근이 쓰기를 허용하는 태그에서만 일어납니다.
  • 값이 문의 본문에 들어가는 일은 없습니다. 쓸 값은 항상 매개 변수 @value, 스테이션의 날짜와 시간은 @now이며, 키 값도 매개 변수입니다. 그 밖의 값을 이름으로 쓰는 문은 거부됩니다.
  • 셀 쓰기는 정확히 한 행을 바꿉니다. UPDATE 명령에는 WHERE가 필요합니다.
  • 데이터베이스에는 읽을 때마다 묻습니다. 다른 프로그램이 바꾼 것은 다음 읽기에서 보이며, 같은 행의 태그가 많은 데이터베이스에는 한 번의 순회에서 그 모두에 대해 한 번만 묻습니다.
  • 이진 열은 읽지 않습니다.