Subversion Repositories factorylink.mb_plus

Rev

Blame | Last modification | View Log | Download

/*name test4.c*/

/* Copyright (C) Modicon, Inc. 1989,  All Rights Reserved. */

/*
This sample program uses the SA85.SYS device driver to access the
Modbus Plus network to read 125 holding registers from a 984-x85 controller
at network address 12.


*/

/*
include


*/
#define STRICT
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <signal.h>
#include "netbios.h"
#include "netlib.h"


/*
prototypes

*/
int main(void);
void control_c(int sig);


/*
global variables


*/
char mbuffer[256];
int completed;


/*
main()


*/

int main()
  {
  NCB *nd;
  int ret_val;

    if( signal( SIGINT, control_c ) == SIG_ERR ) {
        printf( "Unable to redirect Control-C." );
        exit( 1 );
    }
  if ((nd = ncb_open("DM.12.1.0.0.0", 0)) == NULL) {
    printf("Unable to open DATA MASTER path.\n");
    exit(1);
    }
  printf("Path %02X opened\n", nd->NCB_NUM);
  printf("Routing info: %c%c.%d.%d.%d.%d.%d\n",
    nd->NCB_CALLNAME[0],
    nd->NCB_CALLNAME[1],
    nd->NCB_CALLNAME[2],
    nd->NCB_CALLNAME[3],
    nd->NCB_CALLNAME[4],
    nd->NCB_CALLNAME[5],
    nd->NCB_CALLNAME[6]);

  while( !kbhit() ) {
    mbuffer[0] = 0x5; /*slave address*/
    mbuffer[1] = 0x3; /*command*/
    mbuffer[2] = 0x0; /*offset high*/
    mbuffer[3] = 0x0; /*offset low*/
    mbuffer[4] = 0x0; /*reg count high*/
    mbuffer[5] = 125; /* reg count low*/
    printf("+");
    if (ncb_send(nd, 6, mbuffer, 10) != 0) {
            /*send the command*/
      printf("Send error: %d.\n", nd->NCB_RETCODE);
      ret_val = ncb_close(nd);  /*close the path*/
      exit(1);
      }
    if (ncb_receive_wait(nd, mbuffer, 10) != 0) {
            /*try to receive*/
      printf("\nReceive error: %d.\n", nd->NCB_RETCODE);
      }
    printf("-");
    }
  ncb_close(nd);    /*close the path*/

  exit(0);

  return 0;
  }



/*
control_c


This routine replaces the control-C handler supplied by DOS.  When you
type a control_C, the program will vector to this routine, which will
set the completed flag to non-zero.  In this test program, this will cause
the infinite loop within main to terminate.
*/
void control_c(int sig)
{
    signal( SIGINT, SIG_IGN );          /* disable control-c */
    completed = 1;                      /* will cause main loop to complete */
    signal( SIGINT, control_c );        /* reset control-c handler */
}