Scada란
>Scada는 Supervisory Control And Data Acquisition의 약자로 산업 공정 또는 기반 시설 설비 등을 바탕으로 한 작업공정을 감시하고 제어하는 컴퓨터 시스템을 말한다
Scada는 이더넷이나 시리얼통신 등의 네트워크 기반의 소프트웨어로 구성되는데 일반적으로 소프트웨어의 가격이 매우 비싸서 개인 입장에서는 사실상 사용해 볼 엄두도 내지 못한다.
그러나 요즘 들어서는 오픈소스프로그램이 많이 나오다 보니 Scada 프로그램도 몇몇 오픈 소스방식으로 공개된 것이 있다. 오픈소스방식의 Scada중에서 요즘 내가 공부하려는 Python으로 된 PyScada를 선정하여 이에 대한 공부와 함께 이 글을 정리하고 작성해나가고자 한다.
라즈베리파이에 OS설치하기
라즈베리파이에 OS인 라즈비안을 설치하는 과정도 좀 복잡하기 하지만 대부분이 알고 있을 것이라 생각한다. 또 인터넷에 많이 내용이기도 하다. 만약 라즈베리 파이에 OS설치하는 과정에 대해 좀 더 알고 싶다면 아래 링크된 이전 글을 먼저 참고하도록 하자.
2020/04/10 - [IOT/웹서버] - 모니터없이 라즈베리파이 설치하고 원격접속하기
모니터없이 라즈베리파이 설치하고 원격접속하기
일년 전에 라즈베리파이를 처음 접하고 인터넷 검색을 통해 어찌 어찌 라즈베리파이에 OS를 설치하고 사용했었다. 일년 지났다고 벌써 기억이 다 지워져서 아무 생각도 안난다. 어렴픗이 기억나는 것은 PC에서 SD..
expertpro.tistory.com
라즈베리파이에 OS설치가 다 되었으면 라즈비안에 로그인을 해보자
초기상태의 라즈비안은 ID가 pi이고 Password는 raspberry이다
pi
raspberry
로그인한 후에는 라즈비안을 최신으로 업데이트한다
sudo apt-get update
sudo apt-get dist-upgrade
이제 온도센서와 통신할 1-wire 통신을 할 수 있도록 설정한다
sudo raspi-config

메뉴 5. Interfacing Options를 선택한다

테스트를 위해 1-Wire통신방식의 온도모듈을 사용할 것이기 때문에 P7. 1-Wire를 선택하여 사용하겠다고 Yes버튼을 클릭한다
사용의 편리성을 위해 SSH와 VNC도 Enable로 바꾸면 좋다
VNC에 대한 내용은 이 곳 참고.
2020/04/10 - [IOT/웹서버] - 라즈베리파이 VNC로 원격접속하기
오류없이 모든 작업이 완료되었으면 라즈베리파이를 재부팅한다.
PyScada 설치
PyScada 전용 사용자를 만든다
sudo -i
sudo useradd -r pyscada
sudo mkdir -p /var/www/pyscada/http
sudo chown -R pyscada:pyscada /var/www/pyscada
sudo mkdir -p /home/pyscada
sudo chown -R pyscada:pyscada /home/pyscada
sudo ln -s /var/www/pyscada/ ~/www_pyscada
Pyscada와 그 의존성을 설치하고 django 프로젝트를 생성한다
sudo apt-get -y install python-pip libhdf5-dev python-dev nginx gunicorn
sudo pip install cython
sudo pip install numpy
sudo export HDF5_DIR=/usr/lib/arm-linux-gnueabihf/hdf5/serial/
sudo pip install h5py
sudo pip install https://github.com/trombastic/PyScada/archive/dev/0.7.x.zip
cd /var/www/pyscada/
sudo -u pyscada django-admin startproject PyScadaServer
Configuration 파일 편집
sudo nano /var/www/pyscada/PyScadaServer/PyScadaServer/urls.py
아래와 같이 내용을 추가한다
"""PyScadaServer URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.11/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
from django.contrib import admin
urlpatterns = [
url(r'^admin/', admin.site.urls),
url(r'^', include('pyscada.hmi.urls')),
]
다음 파일을 편집한다.
sudo nano /var/www/pyscada/PyScadaServer/PyScadaServer/settings.py
아래 내용에서 SECRET_KEY만 다르고 나머지는 동일하게 수정한다
#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Django settings for PyScadaServer project.
Generated by 'django-admin startproject' using Django 1.11.5.
For more information on this file, see
https://docs.djangoproject.com/en/1.11/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.11/ref/settings/
"""
import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.11/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '8*5gy8$$e8&+cka+&a1lz!#_)s*#zooz6d!+7!f*j%z+uxx376'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
ALLOWED_HOSTS = ['*']
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'pyscada',
'pyscada.modbus',
'pyscada.phant',
'pyscada.visa',
'pyscada.hmi',
'pyscada.systemstat',
'pyscada.export',
'pyscada.onewire'
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'PyScadaServer.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'PyScadaServer.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.11/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
# Password validation
# https://docs.djangoproject.com/en/1.11/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.11/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.11/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = '/var/www/pyscada/http/static/'
MEDIA_URL = '/media/'
MEDIA_ROOT = '/var/www/pyscada/http/media/'
# PyScada settings
# https://github.com/trombastic/PyScada
# email settings
DEFAULT_FROM_EMAIL = 'example@host.com'
EMAIL_HOST = 'mail.host.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'pyscada@host.com'
EMAIL_USE_TLS = True
EMAIL_USE_SSL = False
EMAIL_HOST_PASSWORD = 'password'
EMAIL_PREFIX = 'PREFIX' # Mail subject will be "PREFIX subjecttext"
# meta informations about the plant site
PYSCADA_META = {
'name':'A SHORT NAME',
'description':'A SHORT DESCRIPTION',
}
# export properties
#
PYSCADA_EXPORT = {
'file_prefix':'PREFIX_',
'output_folder':'~/measurement_data_dumps',
}
PyScada 설치 설정
cd /var/www/pyscada/PyScadaServer
sudo -u pyscada python manage.py migrate
sudo -u pyscada python manage.py collectstatic
sudo -u pyscada python manage.py loaddata color
sudo -u pyscada python manage.py loaddata units
위 과정에서 오류가 발생하는 곳이 있으니 소스코드 하나를 수정해야 한다
아마도 Python의 버전차이에서 오는 오류가 아닌가 생각된다
cd /var/www/pyscada/PyScadaServer/PyScadaServer/
sudo nano urls.py
이번에는 PyScada에서 사용할 관리자를 생성해보자
sudo -u pyscada python manage.py createsuperuser
이 과정에서 나중에 로그인할때 사용할 관리자 이름과 암호, 이메일을 입력해야한다
이번에는 ngix를 설정해보도록 하자
ngix는 Apache와 같은 웹서버 프로그램이다
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/nginx_sample.conf -O /etc/nginx/sites-available/pyscada.conf
sudo nano /etc/nginx/sites-available/pyscada.conf
내용는 아래와 같이 수정하되 Servername과 IP address는 자신의 상황에 맞게 수정한다.
# pyscada.conf
# the upstream component nginx needs to connect to
upstream app_server {
server unix:/tmp/gunicorn.sock fail_timeout=0; # for a file socket
#server 127.0.0.1:8000 fail_timeout=0; # for a file socket
}
# configuration of the server
server {
listen 80 default; # the port your site will be served on
server_name 192.168.1.14; # substitute your machine's IP address or FQDN
charset utf-8;
keepalive_timeout 5;
client_max_body_size 75M; # max upload size, adjust to taste
# Django media
location /media {
alias /var/www/pyscada/http/media; # your Django project's medi a files - amend as required
}
location /static {
alias /var/www/pyscada/http/static; # your Django project's stat ic files - amend as required
}
location / {
# checks for static file, if not found proxy to app
try_files $uri @proxy_to_app;
}
location @proxy_to_app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://app_server;
}
}
PyScada nginx사이트를 활성화하고 디폴트값을 제거와 부팅시 nginx 서비스 시작과 nginx 재시작을 한다.
sudo ln -s /etc/nginx/sites-available/pyscada.conf /etc/nginx/sites-enabled/
sudo rm /etc/nginx/sites-enabled/default
sudo systemctl enable nginx.service
sudo systemctl restart nginx
PyScada의 기타 시스템 서비스들을 다운받아서 활성화시킨다
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_daq.service -O /lib/systemd/system/pyscada_daq.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_event.service -O /lib/systemd/system/pyscada_event.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_mail.service -O /lib/systemd/system/pyscada_mail.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/pyscada_export.service -O /lib/systemd/system/pyscada_export.service
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/gunicorn.socket -O /lib/systemd/system/gunicorn.socket
sudo wget https://raw.githubusercontent.com/trombastic/PyScada/dev/0.7.x/extras/service/systemd/gunicorn.service -O /lib/systemd/system/gunicorn.service
# enable the services
sudo systemctl enable gunicorn
sudo systemctl enable pyscada_daq
sudo systemctl enable pyscada_event
sudo systemctl enable pyscada_mail
sudo systemctl enable pyscada_export
** 여기서 몇가지 서비스들에서 오류 발생했슴 (service not exist.)
/lib/systemd/system/pyscada_daq.service
/lib/systemd/system/pyscada_event.service
/lib/systemd/system/pyscada_mail.service
/lib/systemd/system/pyscada_export.service
/lib/systemd/system/gunicorn.service
아래와 같이 파일을 열어서 내용을 약간 편집한다
sudo nano /lib/systemd/system/pyscada_daq.service
sudo nano /lib/systemd/system/pyscada_event.service
sudo nano /lib/systemd/system/pyscada_mail.service
sudo nano /lib/systemd/system/pyscada_export.service
sudo nano /lib/systemd/system/gunicorn.service
replace all the %u with pyscada or the username you intend to use
'라즈베리파이' 카테고리의 다른 글
라즈베리파이 VNC로 원격접속하기 (0) | 2020.04.10 |
---|---|
모니터없이 라즈베리파이 설치하고 원격접속하기 (0) | 2020.04.10 |
라즈베리파이에 Apache 웹서버와 WordPress를 설치해보자(3) (0) | 2020.04.09 |
라즈베리파이에 Apache웹서버와 WordPress를 설치해보자(2) (0) | 2020.04.09 |
라즈베리파이에 아파치 웹서버와 WordPress를 설치해보자 (1) (0) | 2020.04.09 |