PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 9
-КРОНОС- Отправлено: 26 Июня, 2013 - 11:44:20 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
Stierus пишет:
А зачем писать в файл? Есть php скрипт, который вызывает некое приложение, написанное вами, получает его вывод и дословно отдает клиенту (либо не дословно - как уж вы захотите). У вас показываются реальные данные на текущий момент + нет никаких файлов

http://www.php.net/manual/en/book.exec.php
(Добавление)
Я никогда не работал с шаред мемори в пхп, не удивлюсь, если этот функционал сырой, глючный или с ограничениями (например, можно работать только с участками памяти, которые созданы из этого же инстанса php-fpm). Как вариант - вы можете написать свой модуль для php на си, реализующий все то, что вам нужно с доступом из php

Объясняю ще раз. Это свободнопрогрраммируемый промышленный контроллер (ПЛК). Он рабоает на ОС Linux. В Linux крутится ядро SMlogix которое выполянет пользовательские программы. Пользователь пишет программы на языке функциональных блоков (FBD). Данные из этой программы могут быть видны извне линуксу только через Shared Memory. Поэтому других вариантов как не пользоваться Shared Memory не существует. Далее. У меня есть программа сделаная на C++ которая читает эти данные из шаред мемори и пишет в файл с периодичностью 1 раз в секунду. Затем HTML страница считывает эти данные и обновляет при помощи функции AJAX без перезагрузки страницы. НО писать файл раз в 1 секунду - память захлопается через 174 дня (может и больше прорабоатет но всее-же это опасно). Я эе хочу написать код на PHP котрый бы брал данные напрямую из шаред мемори.
-КРОНОС- Отправлено: 26 Июня, 2013 - 10:34:39 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
DeepVarvar пишет:
Судя по коду оно один хрен в файл пишет.
Читайте из файла и все.

ДА! Код пишет в файл! А я не хочу писать в файл. Я привел часть кода который сейчас фактически работает на контроллере. Он читает далнные из Шаред мемори и пишет их в файл. Но это не правльно. т.е. теоретически контроллер умрет. Тесты никто не проводил и не проведет. Соответсвенно я не хочу быть бета-тестером теста "сколько перезаписей файла выдрежит Eeprom. Тем более если я внедрю несколько десятков таких решений а они начнут умирать... Просто код ведь читает из шаред мемори. почему PHP не может? И еще там есть одна переменная mutex... она служит для разделения потоков заипси/чтения шаред мемори. Может дело в ней? может мне тоже в mutex'е при помощи php что-нибудь намудрить?
-КРОНОС- Отправлено: 26 Июня, 2013 - 09:58:21 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
caballero пишет:
Цитата:
рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией...

потому что работа через shared memory сторонним приложением и есть самый настоящий костыль.
какие проблеммы с обменом через обычный файл?

я уже писал. Файл пишется 1 раз в секунду. Заявленный ресурс EEPROM - 15 млн. перезаписей. Таким образом производитель гарантирует что такая программа проработает 174 дня. Дальше - не гарантировано умрет.
(Добавление)
DeepVarvar пишет:
-КРОНОС- пишет:
кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
Кидайте. Но я уже скинул кусок кода для работы с шаред. Или вы не знаете как прикрутить его? Кидайте код на сях.

Я видел Ваш код. Пытался прикрутить - ничего не вышло.
CODE (htmlphp):
скопировать код в буфер обмена
  1. $shm_key = ftok('/dev/shm/wsi', 'b');
  2.  
  3. echo ($shm_key);
  4.  

Вот таким способом я получаю key... он возвращает какое-то значение. Дальше куда бы этот Key я ну пробовал - не возвращает ничего. пробовал Sem_get, sem_attach и прочее - все функции перебрал далее ничего не возвращает. сейчас код на C++ выложу но он большой...
(Добавление)
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. #include "rlsharedmemory.h"
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #ifndef RLWIN32
  7. #include <unistd.h>
  8. #endif
  9.  
  10. #ifdef RLUNIX
  11. #include <sys/ipc.h>
  12. #include <sys/shm.h>
  13. #endif
  14.  
  15. #ifdef __VMS
  16. #include <starlet.h>
  17. #include <lib$routines.h>
  18. #include <descrip.h>
  19. #include <ssdef.h>
  20. #include <syidef.h>
  21. #include <secdef.h>
  22. #include <rms.h>
  23. #include <errno.h>
  24. #include <psldef.h>
  25. #include <dvidef.h>
  26. typedef struct
  27. {
  28.   long start;
  29.   long end;
  30. }
  31. ADD;
  32. #endif
  33.  
  34. #ifdef RLWIN32
  35. #include <windows.h>
  36. #endif
  37.  
  38. static void myinit(pthread_mutex_t *mutex)
  39. {
  40.   int *cnt = (int *) mutex;
  41.   *cnt = 0;
  42. }
  43.  
  44. static void mylock(pthread_mutex_t *mutex, int increment)
  45. {
  46.   int *cnt = (int *) mutex;
  47.   while(1)
  48.   {
  49. retry:
  50.     if(*cnt == 0)
  51.     { // try to lock the counter
  52.       (*cnt) += increment;
  53.       if(*cnt > 1)
  54.       {
  55.         (*cnt) -= increment;
  56.         goto retry; // another process also wanted to lock the counter
  57.       }
  58.       return;       // now we can do it
  59.     }
  60.     rlwthread_sleep(1);
  61.   }
  62. }
  63.  
  64. static void myunlock(pthread_mutex_t *mutex)
  65. {
  66.   int *cnt = (int *) mutex;
  67.   if(*cnt > 0) (*cnt)--;
  68. }
  69.  
  70. rlSharedMemory::rlSharedMemory(const char *shmname, unsigned long Size)
  71. {
  72. #ifdef RLUNIX
  73.   struct shmid_ds buf;
  74.   FILE *fp;
  75.   int file_existed;
  76.  
  77.   status  = OK;
  78.   name = new char[strlen(shmname)+1];
  79.   strcpy(name,shmname);
  80.   size    = Size + sizeof(*mutex);
  81.  
  82.   // create file
  83.   file_existed = 1;
  84.   fp = fopen(name,"r");
  85.   if(fp == NULL)
  86.   {
  87.     file_existed = 0;
  88.     fp = fopen(name,"w");
  89.     if(fp == NULL)    
  90.     {
  91.       int ret;
  92.       char buf[1024];
  93.       sprintf(buf,"could not write shm=%s\n",shmname);
  94.       ret = ::write(1,buf,strlen(buf));
  95.       if(ret < 0) exit(-1);
  96.      sprintf(buf,"you have to run this program as root !!!\n");
  97.      ret = ::write(1,buf,strlen(buf));
  98.      if(ret < 0) exit(-1);
  99.      status=ERROR_FILE;
  100.      exit(-1);
  101.    }
  102.  }
  103.  fclose(fp);
  104.  
  105.  // old stuff, without suggestions from Stefan Lievens
  106.  //shmkey  = ftok(name,0);
  107.  //
  108.  //id  = shmget(shmkey, size, IPC_CREAT);
  109.  
  110.  //shmkey  = ftok(name, 'R');
  111.  shmkey  = ftok(name, 'b');
  112.  
  113.  id  = shmget(shmkey, size, 0666 | IPC_CREAT);
  114.  if(id < 0)           { status=ERROR_SHMGET; return; }
  115.  
  116.  base_adr = (char *) shmat(id,NULL,0);
  117.  if(base_adr == NULL) { status=ERROR_SHMAT;  return; }
  118.  
  119.  if(shmctl(id, IPC_STAT, &buf) != 0) { status=ERROR_SHMCTL; return; };
  120.  
  121.  mutex     = (pthread_mutex_t *) base_adr;
  122.  user_adr  = base_adr + sizeof(*mutex);
  123.  //if(file_existed == 0) rlwthread_mutex_init(mutex,NULL);
  124.  if(file_existed == 0) myinit(mutex);
  125. #endif
  126. #ifdef __VMS
  127.  int file_existed = 0;
  128.  long ret,fd,page_size,pagelets,pagelet_size,file_block_size,flags,item,ident[2];
  129.  FILE *fp;
  130.  ADD  add_in,add_ret;
  131.  struct dsc$descriptor_s section_name;
  132.  struct FAB fab;
  133.  
  134.  status  = OK;
  135.  name = new char[strlen(shmname)+1];
  136.  strcpy(name,shmname);
  137.  size    = Size + sizeof(*mutex);
  138.  // The file block size is fixed
  139.  file_block_size = 512; // Bytes
  140.  // Get the page size
  141.  item = SYI$_PAGE_SIZE;
  142.  ret = lib$getsyi( &item       ,
  143.                    &page_size  ,
  144.                    0           ,
  145.                    0           ,
  146.                    0           ,
  147.                    0
  148.                   );
  149.  if(ret != SS$_NORMAL) { status=ERROR_FILE; return; }
  150.  // Fill descriptor for section name
  151.  section_name.dsc$w_length  = strlen(name);
  152.  section_name.dsc$a_pointer = name;
  153.  section_name.dsc$b_dtype   = DSC$K_DTYPE_T;
  154.  section_name.dsc$b_class   = DSC$K_CLASS_S;
  155.  // The pagelet size is fixed
  156.  pagelet_size = 512; // Bytes
  157.  // Get memory
  158.  if(size % page_size == 0) pagelets = size / pagelet_size;
  159.  else                      pagelets = (size / page_size + 1) * (page_size / pagelet_size);
  160.  ret = sys$expreg(pagelets,&add_ret,0,0);
  161.  if(ret != SS$_NORMAL) { status=ERROR_FILE; return; }
  162.  // Set the addresses
  163.  base_adr = (char *) add_ret.start;
  164.  user_adr = base_adr + sizeof(*mutex);
  165.  mutex    = (pthread_mutex_t *) base_adr;
  166.  if(base_adr == NULL) { status=ERROR_SHMAT;  return; }
  167.  // Fill the fab
  168.  fab = cc$rms_fab;                       // Initialize fab
  169.  fab.fab$b_fac = fab.fab$b_fac | FAB$M_PUT | FAB$M_DEL | FAB$M_GET | FAB$M_UPD;
  170.  fab.fab$l_fna = name;
  171.  fab.fab$b_fns = strlen(name);
  172.  fab.fab$l_fop = fab.fab$l_fop
  173.                      | FAB$M_CIF            // create file if not existent
  174.                      | FAB$M_CTG            // contiguous
  175.                      | FAB$M_UFO;           // user open
  176.  fab.fab$b_shr =   fab.fab$b_shr            // shareble access
  177.                      | FAB$M_SHRPUT
  178.                      | FAB$M_UPI;
  179.  fab.fab$l_alq = pagelets * pagelet_size / file_block_size;
  180.  // Open the section file
  181.  ret = sys$create (&fab);
  182.  if(ret != RMS$_NORMAL && ret != RMS$_CREATED)
  183.  {
  184.    sys$close (&fab);
  185.    status=ERROR_FILE;
  186.    return;
  187.  }
  188.  // Set the channel
  189.  fd = fab.fab$l_stv;
  190.  // Fill the input address
  191.  add_in.start = add_ret.start;
  192.  add_in.end   = add_ret.end;
  193.  // Clear ident
  194.  ident[0] = 0;
  195.  ident[1] = 0;
  196.  // Set flags
  197.  flags = 0;
  198.  flags = SEC$M_GBL | SEC$M_WRT | SEC$M_PERM;
  199.  // Create and map the section
  200.  ret = sys$crmpsc(&add_in ,&add_ret,
  201.                     (long)0       ,  // acmode
  202.                     flags         ,  // flags
  203.                     &section_name ,  // gsdnam
  204.                     &ident        ,  // ident
  205.                     (long)0       ,  // relpag
  206.                     (short)fd     ,  // chan
  207.                     pagelets      ,  // pagcnt
  208.                     (long)0       ,  // vbn
  209.                     (long)0       ,  // prot
  210.                     (long)0          // pfc
  211.                   );
  212.  if(ret != SS$_NORMAL && ret != SS$_CREATED)
  213.  {
  214.    sys$close(&fab);
  215.    status=ERROR_FILE;
  216.    return;
  217.  }
  218.  // Test the section addresses
  219.  if(add_in.start != add_ret.start || add_in.end != add_ret.end)
  220.  {
  221.    sys$close(&fab);
  222.    status=ERROR_FILE;
  223.    return;
  224.  }
  225.  // Close the section file
  226.  ret = sys$close(&fab);
  227.  // rlwthread_mutex_init(mutex,NULL);
  228.  if(file_existed == 0) myinit(mutex);
  229.  return;
  230. #endif
  231. #ifdef RLWIN32
  232.  HANDLE hFile, hShmem;
  233.  int file_existed;
  234.  
  235.  status  = OK;
  236.  name = new char[strlen(shmname)+1];
  237.  strcpy(name,shmname);
  238.  size    = Size + sizeof(*mutex);
  239.  
  240.  file_existed = 1;
  241.  hFile = CreateFile(name,
  242.                     GENERIC_READ | GENERIC_WRITE,
  243.                     FILE_SHARE_READ | FILE_SHARE_WRITE,
  244.                     NULL,
  245.                     OPEN_EXISTING,
  246.                     FILE_ATTRIBUTE_NORMAL,
  247.                     NULL
  248.                     );
  249.  if(hFile ==  INVALID_HANDLE_VALUE)
  250.  {
  251.    file_existed = 0;
  252.    hFile = CreateFile(name,
  253.                       GENERIC_READ | GENERIC_WRITE,
  254.                       FILE_SHARE_READ | FILE_SHARE_WRITE,
  255.                       NULL,
  256.                       CREATE_NEW,
  257.                       FILE_ATTRIBUTE_NORMAL,
  258.                       NULL
  259.                       );
  260.  }
  261.  if(hFile == INVALID_HANDLE_VALUE) { status=ERROR_FILE; return; }
  262.  hShmem = CreateFileMapping(
  263.    hFile,
  264.    NULL,                // no security attributes
  265.    PAGE_READWRITE,      // read/write access
  266.    0,                   // size: high 32-bits
  267.    size,                // size: low 32-bits
  268.    NULL);               // name of map object
  269.  if(hShmem == NULL) { status=ERROR_FILE; return; }
  270.  base_adr = (char *) MapViewOfFile(
  271.    hShmem,              // object to map view of
  272.    FILE_MAP_WRITE,      // read/write access
  273.    0,                   // high offset:  map from
  274.    0,                   // low offset:   beginning
  275.    0);                  // default: map entire file
  276.  if(base_adr == NULL) { status=ERROR_FILE; return; }
  277.  id     = (int) hShmem;
  278.  shmkey = (int) hFile;
  279.  mutex     = (pthread_mutex_t *) base_adr;
  280.  user_adr  = base_adr + sizeof(*mutex);
  281.  if(file_existed == 0) rlwthread_mutex_init(mutex,NULL);
  282. #endif
  283. }
  284.  
  285. rlSharedMemory::~rlSharedMemory()
  286. {
  287.  delete [] name;
  288. #ifdef RLWIN32
  289.  if(status != OK) return;
  290.  CloseHandle((HANDLE) id);
  291.  CloseHandle((HANDLE) shmkey);
  292. #endif
  293. }
  294.  
  295. int rlSharedMemory::deleteSharedMemory()
  296. {
  297. #ifdef RLUNIX
  298.  struct shmid_ds buf;
  299.  if(status != OK) return -1;
  300.  rlwthread_mutex_destroy(mutex);
  301.  shmctl(id, IPC_RMID, &buf);
  302.  size = 0;
  303.  return 0;
  304. #endif
  305. #ifdef __VMS
  306.  int ret;
  307.  ADD add_in,add_ret;
  308.  struct dsc$descriptor_s section_name;
  309.  
  310.  if(status != OK) return -1;
  311.  rlwthread_mutex_destroy(mutex);
  312.  // Fill descriptor for section name
  313.  section_name.dsc$w_length  = strlen(name);
  314.  section_name.dsc$a_pointer = name;
  315.  section_name.dsc$b_dtype   = DSC$K_DTYPE_T;
  316.  section_name.dsc$b_class   = DSC$K_CLASS_S;
  317.  // Delete the section
  318.  ret = sys$dgblsc(0,&section_name,0);
  319.  if(ret != SS$_NORMAL) return -1;
  320.  // Fill the input address
  321.  add_in.start = (long) base_adr;
  322.  add_in.end   = (long) base_adr + size;
  323.  // Free the memory
  324.  ret = sys$deltva(&add_in,&add_ret,0);
  325.  if(ret != SS$_NORMAL) return -1;
  326.  // Test the section addresses
  327.  if(add_in.start != add_ret.start || add_in.end != add_ret.end) return -1;
  328.  return 0;
  329. #endif
  330. #ifdef RLWIN32
  331.  if(status != OK) return -1;
  332.  rlwthread_mutex_destroy(mutex);
  333.  UnmapViewOfFile(base_adr);
  334.  CloseHandle((HANDLE) id);
  335.  CloseHandle((HANDLE) shmkey);
  336.  status = ~OK;
  337.  return 0;
  338. #endif
  339. }
  340.  
  341. int rlSharedMemory::write(unsigned long offset, const void *buf, int len)
  342. {
  343.  void *ptr;
  344.  if(status != OK)      return -1;
  345.  if(len <= 0)          return -1;
  346.  if(offset+len > size) return -1;
  347.   ptr = user_adr + offset;
  348. #ifdef RLWIN32
  349.   rlwthread_mutex_lock(mutex);   // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  350. #else
  351.   mylock(mutex,1);
  352. #endif
  353.   memcpy(ptr,buf,len);
  354. #ifdef RLWIN32
  355.   rlwthread_mutex_unlock(mutex); // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  356. #else
  357.   myunlock(mutex);
  358. #endif
  359.   return len;
  360. }
  361.  
  362. int rlSharedMemory::read(unsigned long offset, void *buf, int len)
  363. {
  364.   void *ptr;
  365.   if(status != OK)      return -1;
  366.   if(len <= 0)          return -1;
  367.  if(offset+len > size) return -1;
  368.   ptr = user_adr + offset;
  369. #ifdef RLWIN32
  370.   rlwthread_mutex_lock(mutex);   // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  371. #else
  372.   mylock(mutex,1);
  373. #endif
  374.   memcpy(buf,ptr,len);
  375. #ifdef RLWIN32
  376.   rlwthread_mutex_unlock(mutex); // Linux and OpenVMS don't support PTHREAD_PROCESS_SHARED (windows does not support pthread at all)
  377. #else
  378.   myunlock(mutex);
  379. #endif
  380.   return len;
  381. }
  382.  
  383. int rlSharedMemory::readInt(unsigned long offset, int index)
  384. {
  385.   int val;
  386.   if(index < 0) return -1;
  387.  read(offset+index*sizeof(val),&val,sizeof(val));
  388.  return val;
  389. }
  390.  
  391. int rlSharedMemory::readShort(unsigned long offset, int index)
  392. {
  393.  short int val;
  394.  if(index < 0) return -1;
  395.  read(offset+index*sizeof(val),&val,sizeof(val));
  396.  return val;
  397. }
  398.  
  399. int rlSharedMemory::readByte(unsigned long offset, int index)
  400. {
  401.  char val;
  402.  if(index < 0) return -1;
  403.  read(offset+index*sizeof(val),&val,sizeof(val));
  404.  return val;
  405. }
  406.  
  407. float rlSharedMemory::readFloat(unsigned long offset, int index)
  408. {
  409.  float val;
  410.  if(index < 0) return -1;
  411.  read(offset+index*sizeof(val),&val,sizeof(val));
  412.  return val;
  413. }
  414.  
  415. int rlSharedMemory::writeInt(unsigned long offset, int index, int val)
  416. {
  417.  int ret;
  418.  if(index < 0) return -1;
  419.  ret = write(offset+index*sizeof(val),&val,sizeof(val));
  420.  return ret;
  421. }
  422.  
  423. int rlSharedMemory::writeShort(unsigned long offset, int index, int val)
  424. {
  425.  int ret;
  426.  short int val2;
  427.  
  428.  if(index < 0) return -1;
  429.  val2 = (short int) val;
  430.  ret = write(offset+index*sizeof(val2),&val2,sizeof(val2));
  431.  return ret;
  432. }
  433.  
  434. int rlSharedMemory::writeByte(unsigned long offset, int index, unsigned char val)
  435. {
  436.  int ret;
  437.  if(index < 0) return -1;
  438.  ret = write(offset+index*sizeof(val),&val,sizeof(val));
  439.  return ret;
  440. }
  441.  
  442. int rlSharedMemory::writeFloat(unsigned long offset, int index, float val)
  443. {
  444.  int ret;
  445.  if(index < 0) return -1;
  446.  ret = write(offset+index*sizeof(val),&val,sizeof(val));
  447.  return ret;
  448. }
  449.  
  450. void *rlSharedMemory::getUserAdr()
  451. {
  452.  return (void *) user_adr;
  453. }
  454.  

вот код описывающий функции работы с Shared Memory. Он сейчас работает на контроллере.
(Добавление)
Со строки 70 идет класс непосредственно работающий с shared memory
-КРОНОС- Отправлено: 26 Июня, 2013 - 08:22:21 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
DeepVarvar пишет:
Подписывайте долгосрочный договор с заказчиком.
Ставьте его на обслуживания.
Осуществляйте обслуживаание.

Нет, это не варинат. тем более я задумал сделать "серийное" устройство которое сможет купить кто угодно. И если они начнуть умирать (пусть даже не через 174 дня, а года через 2) то это будет очень и очень плохо.
(Добавление)
Ch_chov пишет:
Цитата:
Программа на С++ записывает файл 1 раз в секунду.

Может быть есть возможность сделать этот файл "вирутальным"? Разместить на tmpfs и т.д.

рассматривается и такой варинат... но это "костыль"... желательно все-же разобраться как получить данные, тем более что php может работать с shared memory напрямую, то почему бы не воспользовтаься такой функцией... кстати могу скинуть исходнки на С++ в которых реализовано чтение этих данных их Shared Memory... там все работает но по аналогии в PHP реализовать мне пока не удалось...
-КРОНОС- Отправлено: 26 Июня, 2013 - 05:33:59 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
Stierus пишет:
не легче из php вызывать приложение, отдающее всю нужную инфу и тупо ее выводить?

не понимаю о чем Вы?
Мне нужно организовать веб-страничку на которую можно было бы зайти с браузера. Данные для отображения находятся в Shared Memory. Это уже по сути реализовано но через заппись в файл. ПРограмма написана на С++ под линукс выдергивает данные из Shared Memory и записывает их в XML файл. А HMTL страница читает данные из файла и при помощи функции ajax обновляет данные с частотой 1 раз в секунду. НО у данного способа есть ряд минусов:
1. Работает несколько программ для организации веб сервера (так себе минус, но все-же)
2. Производитель контроллера регламентировал 15 млн. перезаписей в EEPROM. Программа на С++ записывает файл 1 раз в секунду. Соответсвенно теоретически производитель гарантирует что такая программа будет работать 174 дня. Далее негарантированно EEPROM начнет умирать. Не хотелось бы чтобы так случилось с уже внедренной системой... (самое страшное что это может вылезти года через 2, когда гарантия закончится... и как тогда я буду выглядеть в глазах заказчика?).
-КРОНОС- Отправлено: 25 Июня, 2013 - 13:54:54 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
DeepVarvar пишет:
Это плохо - сейчас без ООП никуда, тем более в таком деле, когда на один сегмент памяти нужен один экземпляр для работы с этим сегментом.

Я вообще специлиаст по АСУТП и программирую в основном контроллеры и скада-системы... а не по программированию для ПК (немного этим баловался раньше)... и вот теперь попалась смежная задача - надо программить для АСУТП и знать PHP а также разбираться (хотя бы немного) в Linux... вот и пытаюсь...
-КРОНОС- Отправлено: 25 Июня, 2013 - 10:04:47 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
0x134 – адрес переменной в адресном пространстве ядра «logix»
Это написано в руководстве....
-КРОНОС- Отправлено: 25 Июня, 2013 - 07:11:58 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
что-то я почитал и, честно говоря, ничего не понял.
Не поянл что это такое: $this->semkey = $semkey; (this это "указатель" или что-то другое).
Далее...
В приведенном примере есть функция
shm_attach($this->shmkey,$shmsize,0660);
она соаздает или открывает сегмент Shared памяти. Но у меня нет key чтобы получить доступ к этой памяти, и вот этот key как раз мне и необходимо узнать....
-КРОНОС- Отправлено: 25 Июня, 2013 - 06:05:11 • Тема: Shared Memory и PHP • Форум: Операционная система и системные вызовы

Ответов: 29
Просмотров: 9036
Добрый день!
Не знаю в ту ли тему форума задаю вопрос, и сможет ли кто-нибдуь мне помочь.... Попытаюсь описать свою проблему.
1. Есть такие контроллеры для АСУТП под названием Segnetics SMH2Gi, которые работают под управлением ОС Linux. вот ссылка:http://segnetics[dot]com/smh_2gi
2. Для программирования этих контроллеров есть специализированное программное обеспечение Smlogix и в контроллере для Linux написано программное обеспечение, обеспечивающее работу программы написаннной на SMLogix. Для обмена данными из программы написанной в SMLogix с программами на Linux разработчики использовали технологию Shared Memory.
3. В итоге при использовании переменных задествованный во программе SMLogix и выведенных в Shared Memory я имею перечень таких переменных типа такого:
[Slave]
Instat=0xccc0,65536,2
Coil=0xccc1,65538,2
Inreg=0xccc2,65540,24
ShmSize=65564
[Instat]
var0=0x6f,1,0,65536,status
var1=0x71,1,0,65537,zima_leto
[Coil]
var0=0x51,1,0,65538,pusk_stop_btn
var1=0x52,1,0,65539,zima_leto_btn
[Inreg]
var0=0x19a,2,1,65540,vlazh
var1=0x110,4,3,65544,temp_vnesh
var2=0x124,4,3,65548,temp_vitzh
var3=0x138,4,3,65552,temp_room
var4=0x14c,4,3,65556,temp_kanal
var5=0x160,4,3,65560,temp_vobr
Вот описание того, что означают эти цифры и буквы от производителя:
var1=0x134,4,3,8,Parameter
где:
0x134 – адрес переменной в адресном пространстве ядра «logix»
4 – размер переменной в байтах
3 – тип данных переменной в среде «SMLogix» - float (real)
В среде « SMLogix » встречаются типы данных:
• 0 – bool
• 1 – int (тип short int – 2 байта в «C/С++»)
• 2 – long
• 3 – real (тип float в «C/С++»)
8 – адрес переменной в адресном пространстве разделяемой памяти контроллера «/dev/shm/wsi»
Parameter – имя (идентификатор) переменной
4. Теперь собственно какая стоит задача. Мне нужно эти переменные прочитать при помощи PHP (контроллер имеет установленный веб-сервер апач и есть возможность сделать веб-страницу в которой будет отображаться нужная мне информация о работе технологического процесса). Для этого я пробовал использовать функцию shmop_read. И все бы ничего, но вот как найти "Системный идентификатор блока разделяемой памяти" я не знаю. Пытался сделать вот так:
$shm_key = ftok('/dev/shm/wsi', '6');
echo ($shm_key);
echo ('<br>');
echo ('привет <br>');
$shm_id = shmop_open($shm_key, "w", 0, 0);
$shm_size = shmop_size($shm_id);
echo ($shm_size);
$shm_data = shmop_read($shm_id, 65544, 4);
echo ($shm_data);
shmop_close($shm_id);
Естественно ничего не получилось. Как я понял ftok создает новый системный идентификатор а мне нужно найти тот, который уже создан. В общем я встав в тупик и не знаю что делать дальше.
PS Производитель не знает ответа на мой вопрос.

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB