1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не писать свой вопрос в первую попавшуюся тему - вместо этого создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь и здесь, а студентам - обязательно здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Обмен данными между I8000 и модулями I7000 серии

PLC, прочие контроллеры, промышленные компьютеры, операторские панели
Ответить

Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 08:24
Имя: Вечканов Александр Михайлович
Страна: Россия
город/регион: П.-Камчатский
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV »

Здравствуйте уважаемые Эксперты.

Хотелось бы обсудить тему связи между контроллерами и удалёнными модулями ввода/вывода ICP DAS, по COM порту 2 или 3.
но никак не получается организовать связь между контроллером I8811 и удалёнными модулями сбора информации I70хх серии.

Необходимо получить данные от модуля I7017C ,на контроллере,или произвести управляющее воздействие с контроллера на модуль I7061D
Сами модули настроены через DCON_Utility:
I7017C-скорость 9600, адрес 01, остальные настройки заводские... на Ai_0 подключён имитатор токового сигнала;
I7061D-скорость 9600, адрес 07, остальные настройки заводские;
Подключены к COM 3 контроллера.

Непосредственно сама тех программа для контроллера разрабатывается на базе MiniOS7.
Следуя из предоставленных примеров на диске, которые кстати совсем не рабочие, изшерстив львиную часть интернета, перепробовал много вариантов, но организовать обмен так и не получилось. :affliction:

Вот один из примеров для управляющего воздействия на модуль I7061D:

Код: Выделить всё

#include <icpdas.h>
#include "Lib\8000E.H" 
      
void main()      
{ 
InitLib(); 
InstallCom(3, 9600, 8, 0, 0);

SendCmdTo7000(3,"#070001",0);
    
RestoreCom(3);  
}
прошу вас помочь разобраться с обменом данных между контроллером I8811 и модулями i70xx и по возможности привести небольшой работоспособный пример.

Заранее благодарен, всем отозвавшимся.

Исходные коды программ следует оформлять тегом code
VADR
Аватара пользователя

Никита
почётный участник форума
почётный участник форума
Сообщения: 3899
Зарегистрирован: 20 янв 2010, 22:23
Имя: Никита
Страна: РФ
город/регион: Мурманск
Благодарил (а): 18 раз
Поблагодарили: 187 раз

Обмен данными между I8000 и модулями I7000 серии

Сообщение Никита »

А если без всяких контроллеров из терминала послать - работает?
Насколько помню, при "ручном" опросе из самописной программы еще перевод строки нужно добавлять.
Вообще, надо доки на функции из библиотек смотреть - может SendCmd и сама его добавляет. И с контрольной суммой тоже разобраться. Я их уже лет десять не трогал, вспоминать надо.
Ну и в контроллере, ес-но, скомпилированный exe-шник запустить надо.
Опыт - это когда на смену вопросам: "Что? Где? Когда? Как? Почему?" приходит единственный вопрос: "Нахрена? "
Аватара пользователя

vodav
освоился
освоился
Сообщения: 275
Зарегистрирован: 28 авг 2014, 09:30
Имя: Воднев Александр Васильевич
Страна: РФ
город/регион: Томск
Благодарил (а): 16 раз
Поблагодарили: 26 раз

Обмен данными между I8000 и модулями I7000 серии

Сообщение vodav »

Код: Выделить всё

Declaration: 
int InstallCom(int port, unsigned long baud, int data, int parity, [color=#FF0000]int stop[/color]);
Input Parameter: 
Argument What it does 
port 1/2/3/4 for COM 1/2/3/4 
baud Baudrate, 1200,2400,.... 57600,115200 
data Data bits. 6 or 7 or 8(6 only for COM1/2) 
parity Parity bit. 0=None, 1=EVEN, 2=ODD,3=MARK,4=SPACE(3,4 only for COM1/2) 
[color=#FF0000]stop Stop bit. 1= 1 stop-bit, 2=2 stop-bit(2 only for COM1/2) [/color]
А у Вас это значение равно 0. Проверьте еще раз параметры связи.

Фрагменты кода следует окружать тэгом CODE (кнопка есть), иначе может сработать автозамена и вместо скобки будет смайлик.
Админ.

Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 08:24
Имя: Вечканов Александр Михайлович
Страна: Россия
город/регион: П.-Камчатский
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV »

Спасибо парни, что отозвались!!!
Я тоже давно не брался за программирование, но жизнь диктует свои порядки...

В общем разобрался, всё таки запустил демо примеры с диска ICPDAS, просто изначально споткнулся на небольшой мелочи, для модуля I7061D ошибся в максимальном количестве сигналов (выставлял 8 а их 12), а модуль I7017C пытался протащить через COM 2, а там нужно отдельно подключать AddCom2Fun();..., а потом полез в дебри и как обычно бывает не в том направлении...
Ща примеры кину, может кто спасибо скажет. примера два в первом взаимодействие контроллера с модулем I7061D по Com 3, во втором связь контроллера с модулем I7017C по Com 2.

напоминаю ещё раз начальные константы:
контроллер I8811.
Com 2 контроллера - модуль I7017C-скорость 9600, адрес 01, остальные настройки заводские... на Ai_0 подключён имитатор токового сигнала;
Com 3 контроллера - модуль I7061D-скорость 9600, адрес 07, остальные настройки заводские;

Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 08:24
Имя: Вечканов Александр Михайлович
Страна: Россия
город/регион: П.-Камчатский
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV »

взаимодействие контроллера с модулем I7061D по Com 3
(что бы понять какое число Hex переведётся в бит маску используйте инженерный канкулятор, к примеру при посылке числа 3 у вас замкнётся первые два канала)
кода 100% рабочий, уже обкатал, если не идёт проверти переменные связи InstallCom и Write7K87K_DO

Код: Выделить всё

#include <icpdas.h>  
#include <stdio.h>  
#include <stdlib.h>
#include <string.h>
                
#include "Lib\8000E.H" 

int Write7K87K_DO(int iComPort,int iAddress,int TotalChannel,int iCheckSum,int iTimeout,unsigned long lValue);

void main()
{
    int iRet,iChannel;    
    unsigned char cTemp[10];
    unsigned long lDOdata;   
  
    InitLib();  
    InstallCom(3,9600,8,0,1); 

while(!quit)
    { 
        Print("Please Input DO Data(Hex) = ");
        LineInput(cTemp,10); 
        sscanf(cTemp,"%8lX",&lDOdata);
        
        iRet=Write7K87K_DO(3,7,12,0,100,lDOdata);
    }
    RestoreCom(3);
}

int Write7K87K_DO(int iComPort,int iAddress,int iTotalChannel,int iCheckSum,int iTimeout,unsigned long lValue)
{
    int iRet,i;
    unsigned char OutBuf[20],InBuf[20];
    unsigned long iMask=0,x;
    
    for(i=0;i<iTotalChannel;i++)       //Distinguish from channel number
    {
        x=1UL << i;
        iMask|=x;                 
    }
    
    if(iTotalChannel <= 8)
    {
        sprintf(OutBuf,"@%02X%02X",iAddress,(lValue & iMask));
    }
    else if(iTotalChannel <= 16 && iTotalChannel > 8)
    {
        sprintf(OutBuf,"@%02X%04X",iAddress,(lValue & iMask));  
    }
    else
    {
        sprintf(OutBuf,"@%02X%08lX",iAddress,(lValue & iMask));
    }
    
    SendCmdTo7000(iComPort,OutBuf,iCheckSum); 
    iRet=ReceiveResponseFrom7000_ms(iComPort,InBuf,iTimeout,iCheckSum);   
    
    if(iRet==NoError)
    {
        if(InBuf[0] =='>')      //Valid response first character: >
        {
            return NoError;
        }
        else
        	return -1;  //Response string error.
    }
    else 
        return iRet;
}

Автор темы
AMV
здесь недавно
здесь недавно
Сообщения: 8
Зарегистрирован: 26 ноя 2012, 08:24
Имя: Вечканов Александр Михайлович
Страна: Россия
город/регион: П.-Камчатский
Благодарил (а): 2 раза

Обмен данными между I8000 и модулями I7000 серии

Сообщение AMV »

связь контроллера I8811 с модулем I7017C по Com 2
опять же код точно работает, если не идёт, проверти настройки модуля через через DCON_Utility, а также проверти переменные связи проверти переменные связи InstallCom и Read7K87K_AI

Код: Выделить всё

#include <icpdas.h>  
#include <stdio.h>  
#include <stdlib.h>
#include <string.h>
                
#include "Lib\8000E.H" 

int Read7K87K_AI(int iComPort,int iAddress,int iChannel,int iCheckSum,int iTimeout,float *fValue);                            

void main()
{
    int iRet,iChannel;    
    float fValue;
    int quit=0;
         
    InitLib();    
    AddCom2Fun();
  
    InstallCom(2,9600,8,0,1); 

while(!quit)
    { 
    for(iChannel=0;iChannel<=7;iChannel++)
      {
        iRet=Read7K87K_AI(2,5,iChannel,0,100,&fValue); 
        if(fValue<-20){fValue=0;} //что бы отрицательные значения не проскакивали при обрывах
        Print("Ch%d=%6.3f\n\r",iChannel,fValue);        
        if(fValue>=16){quit=1;break;}  //что бы останавливать прокрутку тех программы  
      }     
    Delay(1000); 
    }
    
    RestoreCom(2);
}

//Engineer Unit Format
int Read7K87K_AI(int iComPort,int iAddress,int iChannel,int iCheckSum,int iTimeout,float *fValue)
{
 unsigned char OutBuf[20],InBuf[20];
 int iRet;

    sprintf(OutBuf,"#%02X%01X",iAddress,iChannel);
    iRet=SendCmdTo7000(iComPort,OutBuf,iCheckSum);
    iRet=ReceiveResponseFrom7000_ms(iComPort,InBuf,iTimeout,iCheckSum);   
    
    if(iRet==NoError)
     { if(InBuf[0]== '>')      //Valid response first character: >
        {
            *fValue=atof(InBuf+1);
            return NoError;   
        }
        else
            return -1;          //Response string error.
    }
    else
        return iRet;    
}
Аватара пользователя

vodav
освоился
освоился
Сообщения: 275
Зарегистрирован: 28 авг 2014, 09:30
Имя: Воднев Александр Васильевич
Страна: РФ
город/регион: Томск
Благодарил (а): 16 раз
Поблагодарили: 26 раз

Обмен данными между I8000 и модулями I7000 серии

Сообщение vodav »

vodav писал(а): Фрагменты кода следует окружать тэгом CODE (кнопка есть), иначе может сработать автозамена и вместо скобки будет смайлик.
Админ.
Админу: Где Вы увидели код в моем сообщении? Мне кажется, что это всего лишь текстовое описание функции. К тому же вы снесли цветовое выделение критического места и сообщение потеряло изначальный смысл и всякую логику.
Ответить

Вернуться в «Средний уровень автоматизации (управляющий)»